-
题目描述:Online Judge
-
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
-
输入:
-
输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
。n保证是int范围内的一个整数。
-
输出:
-
对应每个测试案例,
输出一个整数,代表输入的那个数中1的个数。
-
样例输入:
-
3 4 5 -1
-
样例输出:
-
1 2 32
解题思路:
先判断整数二进制表示中最右边是不是1,接着把输入的整数右移以为,直到整个整数变为0为止。
java代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Problem_10 {
public static void main(String[] args) throws IOException {
BufferedReader bu = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer str = new StreamTokenizer(bu);
// while(str.nextToken() != StreamTokenizer.TT_EOL ){
str.nextToken();
int n =(int) str.nval;
int[] input = new int[n];
for(int i = 0; i < n; i ++){
str.nextToken();
input[i] = (int) str.nval;
}//end for
for(int i = 0; i < n; i++){
int count = 0;
int temp = input[i];
while(temp != 0){
count++;
temp = temp&(temp -1);
}//end while
System.out.println(count);
}
// }//end while
}
}
C++代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int T;
cin >> T;
int num;
while(T--)
{
scanf("%d", &num);
int count = 0;
while(num != 0)
{
++count;
num &= (num - 1);
}
printf("%d\n", count);
}
return 0;
}
#include <stdio.h>
int getNumber(int test);
int main(){
int n,i,test;
while(scanf("%d",&n)!=EOF && n > 0){
for(i=0 ; i<n ; i++){
scanf("%d",&test);
printf("%d\n",getNumber(test));
}
}
return 0;
}
int getNumber(int test){
int sum = 0,i;
for(i=0;i<32;i++){
sum+= (test&1);
test = test>>1;
}
return sum;
}
正数(包括边界值1、0x7FFFFFFF)
负数(包括边界值0x80000000、0xFFFFFFFF)
0。
体会:
题目中要注意移位时候的符号问题,负数的时候移位需要特别注意。
此题主要考察二进制的位运算。