有关优化海明悬崖的探讨!
小弟又来请教了。最近写了个程序,觉得自己写的程序很笨,毫无新意,简练,高效,故又来请教大虾们了。希望多多指教了。Problem Description
在信息编码中,两个二进制编码的对应位取值不同的数量称为这两个编码的海明距离。例如:10101和00110从第一位开始依次有第一位、第四、五位不同,则海明距离为3。
若两个二进制编码的每一位都不相同,则这两个编码产生了海明悬崖(Hamming Cliff)。例如,15的二进制编码为01111,16的二进制编码为10000,则产生“Hamming Cliff”。
任务:给你两个正整数,请你判断是否会产生“Hamming Cliff”。
Input
输入数据的第一行为一个正整数T, 表示测试数据的组数。然后是T组测试数据(1<=T<=30)。
每组测试数据输入两个正整数n,m(1<=n<=231-1)。
说明:若两个二进制编码长度不等,则在较短的编码前面添加前导0。
Output
对于每组测试数据,若产生“Hamming Cliff”输出Yes,否则输出No。
Sample Input
2
15 16
2 3
Sample Output
Yes
No
程序代码:
#include<stdio.h> int main() { long a,b; int x[33],y[33]; int i,j,m,n,s,t; scanf("%d\n",&t); for(m=1;m<=t;m++) { i=1; j=1; s=0; scanf("%d",&a); scanf("%d",&b); do { x[i]=a%2; i=i+1; a=a/2; }while(a!=0); do { y[j]=b%2; j=j+1; b=b/2; }while(b!=0); if(j==i) { for(n=1;n<=i-1;n++) {if (x[n]==y[n]) s=1; else s++;} if(s=1) { printf("No"); printf("\n");} else {printf("Yes"); printf("\n");}} if(j>i) { for(n=i;n<=j-1;n++) x[n]=0; for(n=1;n<=j-1;n++) { if (x[n]==y[n]) s=1; else s++;} if(s==j-1) {printf("Yes"); printf("\n");} else {printf("No"); printf("\n");} } if(i>j) { for(n=j;n<=i-1;n++) y[n]=0; for(n=1;n<=i-1;n++) {if (x[n]==y[n]) s=1; else s++;} if(s==i-1) { printf("Yes"); printf("\n");} else {printf("No"); printf("\n");} } } return 0; }