[站长原创]百度笔试的一小题,SHELL求解

jackxiang 2007-11-8 15:49 | |
            以本人性格,就是喜欢抄别人的,这次来点自己的吧,其实也是大家的,一哥们去百度参加面试的题目。。。呵呵,见笑!
如百度4
baidu4:
11 11 11 22 33 44 ...
baidu4中有一行以空格隔开的十进制数,用shell编程求出它们的和并打印。
他shell不行,他用php写了一个。
求正解:
我写了一个如下:
FILE="baidu4"
read line < $FILE
r=0
for num in $line;do
r=$(expr $num + $r)
done
echo $r
在猜朋友写的php,我也写一个PHP的:
<?php
$lines = file('baidu4');
$result2 = 0;
foreach ($lines as $line_num => $line) {
  $result = explode(" ",$line);
  for($i=0;$i<count($result);$i++)
    {
    $result2 += $result[$i];
    }
  echo $result2;        
}
?>

再来个awk的:
#!/usr/bin/awk -f
BEGIN{}
        {
                sum = 0;
                for (i=1; i<=NF; i++)
                {
                        sum += $i;
                }
                printf("count == [%d]\n",  sum);
        }
END{}



我在用c语言写一个吧:
太难用指针,让玩得好的指导下写了一个感谢罗玉峰,可以求多行的结果呢:
#include <string.h>
#include <stdio.h>
char *pp,*p;
char linebuf[4096];
char tmp[1024];
int i,tmpl;
int  main(void)
{
FILE *fp;
if ( ( fp = fopen ("baidu4", "r") ) == NULL )
{
       printf("cant't open the baidu4 file ");
       exit(0);
}
while(fgets(linebuf,4096,fp))
{    
linebuf[strlen(linebuf)-1] = 0;
pp=linebuf;
tmpl=0;
p=strchr(pp,' ');
while(p != NULL)
{
  strncpy(tmp, pp, p-pp);
  printf("tmp=[%s]\n", tmp);
  tmpl+=atoi(tmp);
//  memset(tmpl, 0x00, sizeof(tmpl));
  memset(tmp, 0x00, sizeof(tmp));
  pp=p+1;
  p=strchr(pp,' ');
}
if (*pp)
{
  strcpy(tmp, pp);
  tmpl+=atoi(tmp);
  printf("tmp=[%s]\n", tmp);
}
printf("total=%d",tmpl);
memset(linebuf, 0, sizeof(linebuf));
//memset(tmpl, 0, sizeof(tmpl));
printf("----------------\n");
}
return 0;
}
那位哥们能用java写个就完美了,:-)
这位留言的哥哥真高,用sed替换和管道导入计算器bc来计算,确实很高:

Exaple: baidu4
11 11 11

jackxiang@jackxiang-laptop:~$ sed 's/ /+/g' baidu4
11+11+11
jackxiang@jackxiang-laptop:~$ sed 's/ /+/g' baidu4| bc
33
jackxiang@jackxiang-laptop:~$

感谢那个留言的哥们,bc
echo " 930307 -   921336"|bc

[/home/jackxiang/bc]# echo " 930307 -   921336"|bc
8971
   将10进制数转换成16进制数

  比如转换 65535 为 16进制

  echo 'obase=16; 65535' | bc

  得到 FFFF



echo 'obase=16; ibase=8; 177777' | bc

  可以直接将八进制的数177777变成十六进制,也是FFFF

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/747/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2010-9-15 13:04
评论列表
2010-1-13 23:27 | root Email Homepage
uplook
2010-1-13 14:25 | wqfhenanxc
thumbdown
哥来个简单的:
sed 's/ /+/g' baidu4| bc
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]