目录
描述
输入描述:
输出描述:
解题过程
提交代码一(常规方法)
提交代码二(位运算方法)
学习代码
代码一
代码二
收藏点
描述
输入一个正整数,计算它在二进制下的1的个数。
注意多组输入输出!!!!!!
数据范围:1≤n≤2^31−1
输入描述:
输入一个整数
输出描述:
计算整数二进制中1的个数
解题过程
啪的一下啊,很快啊。
我觉得是考察多组出入输出。
不对,上面写的是考察位运算。所以,以后确实要看考察点了,不能随便写。
提交代码一(常规方法)
#include <stdio.h>
int main() {
int a, b=0;
while (scanf("%d", &a) != EOF) {
while(a)
{
if(a%2==0)
a/=2;
else
{
b++;
a--;
a/=2;
}
}
printf("%d\n",b);
b=0;
}
return 0;
}
提交代码二(位运算方法)
//位运算方法
#include <stdio.h>
int main() {
int a, b=0;
int ii=32;
while (scanf("%d", &a) != EOF) {
b=0;
while(ii)
{
if((a&1)==1)//其实更好是a&0x01;
{b++;}
a>>=1;
ii--;
}
printf("%d\n",b);
}
return 0;
}
学习代码
代码一
(来源:https://www.nowcoder.com/users/297309805)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n;
int count = 0;
while(scanf("%d",&n)!=EOF)
{
count = 0;
do{
count+= n&0x01;
}while((n>>=1)>0);
printf("%d\n",count);
}
return 0;
}
我觉得值得学习的一点是,他的条件是这样限制的:
这样就降低了时间复杂度。
代码二
(来源:【十二题解】 | #查找输入整数二进制中1的个数#_牛客博客)
#include<stdio.h>
int main(){
int number;
while(scanf("%d", &number) !=EOF){
int count = 0;
for(int i=0; i<31; i++){
if(number & 1 == 1)count++;
number >>= 1;
}
printf("%d\n", count);
}
和我的思路很像,优势在于简洁。
收藏点
位运算注意三点:
1. 右移/2,左移*2,这个我能记住;
2. num>>=1的格式
3. num&0x01的写法,更专业。