以本人性格,就是喜欢抄别人的,这次来点自己的吧,其实也是大家的,一哥们去百度参加面试的题目。。。呵呵,见笑!
如百度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
[/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
如百度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应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/747/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2010-9-15 13:04
哥来个简单的:
sed 's/ /+/g' baidu4| bc