| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2989 人关注过本帖
标题:[讨论]统计二进制中1的个数
只看楼主 加入收藏
dengll23
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2007-3-22
收藏
得分:0 

#include <stdio.h>

int main()
{
int n;
int count=0;

scanf ("%d",&n);

while (n)
{
if (n%10)
++count;
n/=10;
}

printf ("The number of 1 is: %d\n",count);

return 0;
}



#include <stdio.h>

int main()
{
char ch;
int count=0;

while ((ch=getchar())!='\n')
if (ch=='1')
++count;

printf ("The number of 1 is: %d\n",count);

return 0;
}



我写了这两个版本的.

我认为输入的时候不一定非要是2进制

这程序很简单,我认为招聘方就是要看你是如何来分析的



2007-11-05 18:44
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
移位可以的吧?只不过没有3楼的程序效率高而已

从BFS(Breadth First Study)到DFS(Depth First Study)
2007-11-05 18:44
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
如果不绕弯的话,你可以试下.

倚天照海花无数,流水高山心自知。
2007-11-05 18:46
dengll23
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2007-3-22
收藏
得分:0 
以下是引用静思在2007-11-5 11:19:34的发言:

/*计算整数number的比特位值为1的位数*/
int getBits(int number)
{
int sum= 0;

for( ; number; number&= number-1)
sum++;
return sum++;
}
关键是:number &=(number-1)
1):number 为奇数,则number&=(number - 1)提取末尾1,并将结果赋给number。计数器显然要加1。
2):number 为偶数,则number&=(number - 1)number最末尾的1置成0,其余不变,并将结果赋给number。若此时number不为0,则说明仍可继续,由于已经将number最末尾的1置成0,因此,计数器也要加1。

详见《高效程序的奥秘》。





#include <stdio.h>

int main()
{
int n;
int count=0;

scanf ("%d",&n);
for(;n!=0;n&=n-1)
count++;
printf ("The number of 1 is: %d\n",count);

return 0;
}


是不是我写错了啊....

我不知道错在哪里了...

2007-11-05 19:45
lw_China
Rank: 1
来 自:peking
等 级:新手上路
帖 子:73
专家分:0
注 册:2007-11-4
收藏
得分:0 
呵呵``经典面式题哈。

最简单的就是,一个一个数。

如果要效率,就查找表。

如果又要时间又要空间,先到查找表里找,没有的话,算出来,然后再放查找表.

在这里推荐一本书 <The C Programming Language>
2007-11-05 19:57
dengll23
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2007-3-22
收藏
得分:0 
汗...

输入的是10进制数,我把它当2进制了...
2007-11-05 20:04
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 

如果32位的整数要移31次位,128位就是128次

如果使用“3楼 静思”的方法,那就可以减少循环的次数,
除非那个数字中的位全是1。


—>〉Sun〈<—
2007-11-05 22:09
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 

3楼正解
那本书也是好书。。。

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-11-05 22:50
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 

既然大家喜欢,就再发几个:

几个常用的位操作

下面的结论都是基于用补码表示负数的计算机平台
1 int main(unsigned int x)
2 {
3 //判断无符号整数x是否是2的幂
4 if(x&(x-1))//若一个数是2的幂,则除最高位为1外,其余位均为0(二进制表示,下同)
5 printf("False\n");
6 else
7 printf("True\n");
8
9 //判断一个无符号整数是否为2^n-1的形式(原理同上)
10 if(x&(x+1))//若为2^n-1,则低位全为1
11 printf("False\n");
12 else
13 printf("True\n");
14
15 //整数能被最大的2的幂(?)整除 : 析出最右侧为1的位
16 //e.g.: 100->4
17 printf("%d\n",x&(-x));//将其余位置0
18
19 //析出最右侧为0的位(原理同上)
20 //e.g.:111b->1000b, 10->1
21 printf("%d\n",~x&(x+1));//将该位置1,其余位置0
22
23 //识别后缀0的掩码(将右侧连续的0位置1,其余各位置0)
24 //e.g.:1100b->0011b
25 printf("%d\n", ~x&(x-1)); //或
26 printf("%d\n", ~(x|-x)); //或
27 printf("%d\n", (x&-x)-1);
28
29 //识别最右侧的1未和后缀0的掩码(将最右侧的1位保留,并将其后面所有的0位置1)
30 //e.g.:1100b->0111b
31 printf("%d\n", x^(x-1));
32
33 //向右传播最右侧的1位
34 //e.g.:1100b->1111b
35 printf("%d\n", x|(x-1));
36
37 //将最右侧连续的1位置0
38 //e.g.:10110b->10000
39 printf("%d\n", ((x|(x-1))+1)&x);
40 }


计算x中有多少个为1的位:
1 int Count1(int x)
2 {
3 int n = 0;
4 while(x)
5 {
6 n++;
7 x&=x-1;
8 }
9 return n;
10 }


获取下一个具有同样数量的1位的更大的数;应用:在用位串表示集合的子集时
1 unsigned snoob(unsigned x)
2 {
3 unsigned smallest, ripple, ones;//e.g.: x=XXX0 1111 0000
4 smallest = x & -x; // 0000 0001 0000
5 ripple = x + smallest; // XXX1 0000 0000
6 ones = x ^ ripple; // 0001 1111 0000
7 ones = (ones >> 2) / smallest; // 0000 0000 0111
8 return ripple | ones; // XXX1 0000 0111
9 }


2007-11-06 13:57
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 

嗯,不错,涵盖了基本的位操作


英者自知,雄者自胜
2007-11-06 14:27
快速回复:[讨论]统计二进制中1的个数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019044 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved