数制转换的题,查不出错来。。大家帮忙看下。。谢谢
。。检查了两个周都没看出来哪错了,两个隐藏用例过不了我们通常使用的都是十进制的数字,但其实在生活中也经常会使用其它进制。
这个题目会给你两个不同的数字,它们不属于同一进制,要求你计算出当它们分别处于何种进制之中时,两个数字相等。譬如 12 和 5 ,在十进制下它们是不等的,但若 12 使用 3 进制而 5 使用六进制或十进制时,它们的值就是相等的。因此只要选择合适的进制, 12 和 5 就可以是相等的。
程序的输入是两个数字 M 和 N( 其十进制的值不超过 1000000000) ,它们的进制在 2~36 之间。对于十以下的数字,用 0~9 表示,而十以上的数字,则使用大写的 A~Z 表示。
求出分别在 2~36 哪种进制下 M 和 N 相等。若相等则输出相应的进制,若不等则输出错误信息。当然了,对于多种可能成立的情况,找出符合要求的进制最小的一组就行了。信息的格式见测试用例。
例:
输入:12 5
输出:12 (base 3) = 5 (base 6)
输入:123 456
输出:123 is not equal to 456 in any base 2..36
程序代码:
#include<stdio.h> #include<stdlib.h> int cf(int m,int n) { int i,d=1; for(i=1;i<=n;i++) d=d*m; return (d); } main() { int a[30]={0},i,c,b[30]={0},n=0,m=0,max1=0,max2=0,d,sum1=0,sum2=0; char e[30],f[30]; for(i=0;c!=' ';i++)//空格时结束循环 { scanf("%c",&e[i]); //输入字符 c=e[i]; a[i]=e[i]; //保存ASCII码 n++; } n--; //输入的字符的数量 c=0; gets (f); //输入字符 for(i=0;f[i]!='\0';i++) { b[i]=f[i]; //ASCII码 m++; //字符数量 } for(i=0;i<=n-1;i++) { if(a[i]>=48&&a[i]<=57) a[i]=a[i]-48; else if(a[i]>=65&&a[i]<=90) a[i]=a[i]-55; else a[i]=0; }//把a[i]变成每一位代表的数字 for(i=0;i<=m-1;i++) { if(b[i]>=48&&b[i]<=56) b[i]=b[i]-48; else if(b[i]>=65&&b[i]<=90) b[i]=b[i]-55; else b[i]=0; }//把b[i]变成每一位代表的数字 for(i=0;i<=n-1;i++) if (a[i]>max1) max1=a[i]; for(i=0;i<=m-1;i++) if (b[i]>max2) max2=b[i]; //求最大值以确定最小进制 for(c=max1+1;c<=36;c++) { sum1=0; for(d=0;d<=n-1;d++) sum1=sum1+a[d]*cf(c,n-1-d);//转化为10进制 for(i=max2+1;i<=36;i++) { sum2=0; for(d=0;d<=m-1;d++) sum2=sum2+b[d]*cf(i,m-1-d);//转化为10进制 if(sum1==sum2) { for (d=0;d<=n-1;d++) printf("%c",e[d]); printf(" (base %d) = ",c); d=0; while(f[d]==' ') d++; for (;d<=m-1;d++) printf("%c",f[d]); printf(" (base %d)\n",i); goto k; } if(c==36&&i==36&&sum1!=sum2) { for (i=0;i<=n-1;i++) printf("%c",e[i]); printf(" is not equal to "); i=0; while(f[i]==' ') i++; for (;i<=m-1;i++) printf("%c",f[i]); printf(" in any base 2..36\n"); goto k; } } //输出结果 } k:system("pause"); }