经典笔试问题
“请用C实现统计任意长度的任意数中1的个数。”
不要觉得这个题目简单,这是微软笔试经典问题,据说现在还在用。
要用不同的方法实现,你看看你能想出多少种方法。
注意:禁止用混乱编程的方式
[
本帖最后由 leang521 于 2011-7-4 09:06 编辑 ]
想到最简单的: x &0x01 若 为1加count +1 x右移一位
测试平台RHEL6
#include
#include
int main(int argc, char *argv[])
{
if (argc < 2) {
printf("Error:No number to count\n");
exit(-1);
}
int count = 0;
int temp = 1;
int num = atoi(argv[1]);
while (0 != num) {
if (1 == (num & temp)) {
count += 1;
}
num = num >> 1;
}
printf("There are %d \" 1 \" in %s !\n", count, argv[1]);
return 0;
}
回复 楼主 leang521 的帖子
老大,这个 任意个数,是不是说,是很多很多个数字,
然后是0 和 1 还是还包括23456.....
另外就是,这个包括1的个数,指的是 上面 说的那个数值是1呢,还是说它们的,比方说 二进制码 里 的 1?
不好意思,因为我实在没看明白这个题目。
隋机数,然后要1个数
这个有点费劲
http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
标题
反正就是移位统计快,嫌慢也可两位或三位的移,加个case判断。除二或除四或除八求余也行,一直除到等于零。其他方法等我再想想
既然要用很多种办法实现,那楼主先列举两种方法啊,也好让大家更好的理解题意
我提这个讨论的目的,在于巩固大家的C基本功。在高的楼,地基最重要。夯实基础,成就技术。所以我问的这个问题的目的是为了让大家抽象出基础中的基础。要知道在高级的算法也需要这些个像砖头一样的知识点来铸就。
关于我的这个问题,大家可以从C的各种特性来实现,if、while、for、还有“位图”查表算法,还还有“/(value =value/2;)”、“%(value % 2 == 1)”、“>>(value >>=1;)”、“&(value & 1 !=0)或(sum +=value & 0x01;)”、“补码(value &=(value-1);)”......
我这次的目的,就在于希望论坛能回归到基础中来,而不是好高骛远。所以,大家各言所思吧
回复 6楼 leang521 的帖子
哦,是这样。这个好玩。
回复 10楼 leang521 的帖子
想一想再说。
要说简单的方法,那就是模2除2什么的,但你的题目问得这么有意思,我也得好好想才行啊。
对了,老大忘了说
论坛的 嵌入式版块里 有个子版块 编程基础,以后有C的每日一问,不如扔哪里去,,,,
合乎主题,也可以把新版块搞起来撒。
回复 14楼 leang521 的帖子
如果这个论坛的气氛还叫差,那估计是没啥戏了。
你去看看CSDN啊,什么的,那才叫人失望。