G - 有多少位不同

给定两个十进制正整数A和B,请计算出A和B用二进制表示时有多少位是不同的。 
例如,“3”的二进制表示为“11”,“9”的二进制表示为“1001”,“11”不足4位,不足部分实际上为0,即“0011”,因此二者从右至左第2、4位不同,所以3和9用二进制表示时有两位不同。

Input

输入包括两行,第1行是一个整数n,表示有n组测试数据。紧接着n行,每行包括两个十进制正整数A和B,A、B之间用空格隔开。

Output

输出有n行,为每组测试数据中A和B用二进制表示时不相同的位数。

Sample Input

1
3 9

Sample Output

2
#include<stdio.h>
#define N 1000
int a[N],b[N];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--){
//flag用来存储有多少位不同
		int large,small;
		
		int flag=0,i=0,j=0;
		scanf("%d%d",&large,&small);
		
		if(small>large) {
			int t;t=small;small=large;large=t;
		}
		//用数组a来存储小的那个数的二进制
		while(small){
			a[i++]=small % 2 ;
			small/=2;
		}
		//b来存储大的数的二进制
		while(large){
			b[j++]=large % 2 ;
			large/=2;
		}
		
		int k=i;
//比较小的那个数的有效范围里面,有多少位不同
		for(i=0;i<k;i++)
		if(a[i]!=b[i]) flag++; 
/*再超出小的数有效范围的数里,小的那个都是零,也就是说
只知道二进制那一位里是1就不同*/
		for(i=k;i<j;i++)
		if(b[i]==1) flag++;
		printf("%d\n",flag);
		
	}
}

这种方法是比较死板的,不灵活,可以使用位运算的骚操作。


/* Bailian3710 有多少位不同 */
 
#include <stdio.h>
 
int main(void)
{
    int n, a, b, c, count;
 
    scanf("%d", &n);
    while(n--) {
        scanf("%d%d", &a, &b);
 
        c = a ^ b;
/*嗯,直接异或,判断有几个1就是不同*/
        count = 0;
/*判断有几个1*/
        while(c) {
            if(c & 1)
                count++;
            c >>= 1;
        }
 
        printf("%d\n", count);
    }
 
    return 0;
}

OK,AC ,两种做法都能行,要是知道一些计算技巧就更简单了。

猜你喜欢

转载自blog.csdn.net/weixin_42324904/article/details/81170065
G