数制转换的题,查不出错来。。大家帮忙看下。。谢谢
。。检查了两个周都没看出来哪错了,两个隐藏用例过不了我们通常使用的都是十进制的数字,但其实在生活中也经常会使用其它进制。
这个题目会给你两个不同的数字,它们不属于同一进制,要求你计算出当它们分别处于何种进制之中时,两个数字相等。譬如 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");
}









