永发信息网

一个关于二进制求1的个数的问题

答案:1  悬赏:10  手机版
解决时间 2021-05-06 06:27

程序名稱: PROGRAM3.EXE

輸入: 標準輸入

輸出: 標準輸出

最長運行時間: 1秒

小明是一個剛學會了二進制數字表示法的學生。他知道每個正整數能以「0」和「1」的數列表示。為了練習所學,他分別把所有從1至N的整數寫成二進制表示,且互不重覆。

請你找出小明從中寫下了多少個「1」。

例如當N = 5,下表展示了從1至N的二進制表示﹕

十進制表示

1

2

3

4

5

二進制表示

1

10

11

100

101

「1」的數量

1

1

2

1

2

從上表可見,當N = 5時,小明總共寫下了7 (=1+1+2+1+2)個「1」。

輸入

輸入僅一行,包含一整數N。

輸出

輸出僅一行,為小明寫下了「1」的次數。

樣例輸入

5

樣例輸出

7


約束條件

對於所有測試數據,

Ø

Ø 1 £ N £ 258

對於50%的測試數據,

Ø 1 £ N £ 100,000

注意事項

如果需要處理大於232-1的整數,使用C/C++的參賽者需要使用「long long」(不包括引號)資料型態。以下為使用「long long」作輸入及輸出的樣例﹕

#include "stdio.h"int main(){ long long x; scanf("%I64d", &x); printf("%I64d\n",x); return 0;}

使用Pascal的參賽者需要使用「int64」(不包括引號)資料型態。注意「int64」並非順序型態。以下為使用「int64」作輸入及輸出的樣例﹕

var x : int64;begin readln(x); writeln(x);end.

问题补充 2009-10-20 20:34 问题补充 2009-10-20 20:35
最佳答案

用位运算就可以了。代码如下:


#include "stdio.h"
int main()
{
long long x;
scanf("%I64d", &x);
int count = 0;
while(x!=0)
{
int y = x & 1; //取最低位
if(y == 1) //如果最位为1,计数加1
{
count++;
}
x = x >> 1; //x的二进制向右移一位
}
printf("%d\n",count);
return 0;
}

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
这是紫砂还是泥壶?
谁能给我推荐几种图片或者网页排版方式,想了
办理挪威塔纳结婚出国签证怎么办理
用手机买的瑞星就有个账号密码咋激活啊
请问“超”的英语单词是什么?
我最近老失眠、怎么回事
驾驶证考完多久能下来啊 谁知道 ???
中国联通(北郊姚孟专营店)在什么地方啊,我要
白头发看什么科,掉头发应该挂什么科
介绍几首悲伤的歌
人为什么要玩QQ
处女膜没破,月经的时候是怎么流血的?
QQ看不到别人的截图,自己也发不了截图,为什
谁有这个qq皮肤的完整图片
象龟会不会游泳
推荐资讯
QQ校友的QQ餐厅和QQ空间的QQ餐厅是一起的吗?
谁知道怎样说话不用耳机直接对着电脑说?
小乌龟一直不吃食怎么办?
为什么我的空间打开任意一个应用时都跑到屏幕
任岩松中学 和铜梁中学哪个好
地下城与勇士这个可以卖多少啊
大海有多大????
化工与制药类专业都开设那些课程?
昙花,玫瑰怎么比较
为什么我DNF下了G就要下补丁还下不完
梦幻诛仙中到20级后怎么样在官网上抽奖励
姓名藏头诗在线制作
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?