LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 6977|回复: 18

考考你:1到999999999的阵列,如何用shell实现?

[复制链接]
发表于 2004-5-14 01:25:18 | 显示全部楼层 |阅读模式
效果:
1+11+111+1111+11111+111111+1111111+11111111+111111111 =   123456789
2+22+222+2222+22222+222222+2222222+22222222+222222222 =   246913578
3+33+333+3333+33333+333333+3333333+33333333+333333333 =   370370367
4+44+444+4444+44444+444444+4444444+44444444+444444444 =   493827156
5+55+555+5555+55555+555555+5555555+55555555+555555555 =   617283945
6+66+666+6666+66666+666666+6666666+66666666+666666666 =   740740734
7+77+777+7777+77777+777777+7777777+77777777+777777777 =   864197523
8+88+888+8888+88888+888888+8888888+88888888+888888888 =   987654312
9+99+999+9999+99999+999999+9999999+99999999+999999999 =  1111111101

源贴见:
http://www.linuxsir.cn/bbs/showthread.php?threadid=108429
发表于 2004-5-14 03:12:29 | 显示全部楼层
太难,不会........
发表于 2004-5-14 10:19:13 | 显示全部楼层

  1. #!/bin/sh
  2. exp=""
  3. for j in $(seq 9); do
  4.         i=$j
  5.         for k in $(seq 9);do
  6.                 j="$j"$i
  7.                 exp=$exp"$j+"
  8.         done
  9.         exp=$i"+"${exp%+*+}
  10.         echo "${exp} = "$(($exp))
  11.         exp=""
  12. done
复制代码

结果:

  1. 1+11+111+1111+11111+111111+1111111+11111111+111111111 = 123456789
  2. 2+22+222+2222+22222+222222+2222222+22222222+222222222 = 246913578
  3. 3+33+333+3333+33333+333333+3333333+33333333+333333333 = 370370367
  4. 4+44+444+4444+44444+444444+4444444+44444444+444444444 = 493827156
  5. 5+55+555+5555+55555+555555+5555555+55555555+555555555 = 617283945
  6. 6+66+666+6666+66666+666666+6666666+66666666+666666666 = 740740734
  7. 7+77+777+7777+77777+777777+7777777+77777777+777777777 = 864197523
  8. 8+88+888+8888+88888+888888+8888888+88888888+888888888 = 987654312
  9. 9+99+999+9999+99999+999999+9999999+99999999+999999999 = 1111111101
复制代码
发表于 2004-5-14 10:22:29 | 显示全部楼层
上面是在Linux的bash下的code. 不知还有没有更简便的方法. 还有就是能用sed或awk做吗?
 楼主| 发表于 2004-5-14 11:06:09 | 显示全部楼层
最初由 yongjian 发表
上面是在Linux的bash下的code. 不知还有没有更简便的方法. 还有就是能用sed或awk做吗?

PF~~~,awk应该可以的,:thank
 楼主| 发表于 2004-5-14 12:18:17 | 显示全部楼层
我也写了一个 ,望大家指教:thank

  1. /home/lee#cat _test
  2. #!/bin/ksh
  3. n=1;while ((n<=9));do
  4.         m=0;p=0
  5.         while ((m<=8));do
  6.                 a=$(echo "$n*10^$m"|bc);((p+=a));
  7.                 echo -n "$p+";((m+=1))
  8.         done|sed 's/+$/\
  9. /'
  10.         ((n+=1))
  11. done|while read i;do
  12.         echo -n "$i=";echo $i|bc
  13. done
复制代码
/home/lee#ksh _test
1+11+111+1111+11111+111111+1111111+11111111+111111111=123456789
2+22+222+2222+22222+222222+2222222+22222222+222222222=246913578
3+33+333+3333+33333+333333+3333333+33333333+333333333=370370367
4+44+444+4444+44444+444444+4444444+44444444+444444444=493827156
5+55+555+5555+55555+555555+5555555+55555555+555555555=617283945
6+66+666+6666+66666+666666+6666666+66666666+666666666=740740734
7+77+777+7777+77777+777777+7777777+77777777+777777777=864197523
8+88+888+8888+88888+888888+8888888+88888888+888888888=987654312
9+99+999+9999+99999+999999+9999999+99999999+999999999=1111111101
发表于 2004-5-14 12:55:22 | 显示全部楼层
最初由 javalee 发表
PF~~~,awk应该可以的,:thank


  1. BEGIN{
  2.         FS=""
  3. }
  4. {
  5.         for(i=1;i<=NF;i++) {
  6.                 pre=$i
  7.                 sum[$i]=$i
  8.                 printf("%d",pre)
  9.                 for(j=1;j<9;j++) {
  10.                         cur=pre*10+$i
  11.                         sum[$i]+=cur
  12.                         pre=cur
  13.                         printf("+%d",cur)       
  14.                         if(j==8) printf("=%d\n",sum[$i])
  15.                 }
  16.         }
  17. }
复制代码

echo "123456789" | awk -f awkscript
发表于 2004-5-14 20:34:44 | 显示全部楼层
精彩!!!
发表于 2004-5-14 21:49:15 | 显示全部楼层
exp这个东东我还真没见过,:thank all of you!

如果进一步要求每行的值右边对齐的话,该如何实现呢?
发表于 2004-5-14 23:38:59 | 显示全部楼层
呵呵,挨个运行了一下,族长的代码最慢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表