6×9=42,对于十进制来说是错误的,但是对于十三进制来说就是正确的,即6(13) ×9(13)=42(13),而42(13)=4×131+2×130=54(10)。你的任务是编写一段程序读入三个整数p、q和r,然后确定一个进制B(2<=B<=16),使得p×q=r。
如果B有很多选择,则输出最小的一个。例如:p=11,q=11,r=121,则有11(3) ×11(3)=121(3),11(3)=1×31+1×30=4(10)和121(3)=1×32+2×31+1×30=16(10)。对于十进制,有11(10) ×11(10)=121(10)。这种情况下,应该输出3。如果没有合适的进制,则输出0。
输入:从键盘输入三个整数p,q,r,输入0 0 0时结束。
输出:能满足上述表达式的进制。
输入样例:
6 9 42
11 11 121
0 0 0
输出样例:
13
3
#include<stdio.h>
#include<math.h>
#define N 200
int Switch(int m,int R);
int bit(int p,int q,int r,int B); //判断各个位的数是否在进制范围内
int main()
{
int p,q,r,p1,q1,r1;
int B=2;
int a[N],num;
int flag=1;
int i=0,j=0;
while(1)
{
scanf("%d%d%d",&p,&q,&r);
if(p==0&&q==0&&r==0) //当输入的三个数全部为0是停止输入
break;
for(B=2;B<=16;B++)
{
if(bit(p,q,r,B)) //排查三个数各个位的数是否在进制范围内
{
p1=Switch(p,B);
q1=Switch(q,B);
r1=Switch(r,B); //将三个数全部转换为十进制
if(p1*q1==r1)
{
num=B; //如果等式成立,停止输入
break;
}
else num=0; //若等式不成立则输出0
}
}
a[i++]=num;
}
for(j=0;j<i;j++)
printf("%d\n",a[j]);
return 0;
}
int Switch(int m,int R)
{
int k=0;
int n;
int sum=0;
while(m)
{
n=m%10;
m=m/10;
sum=sum+n*pow(R,k);
k++;
}
return sum;
}
int bit(int p,int q,int r,int B)
{
int n1,n2,n3;
while(p)
{
n1=p%10;
if(n1>=B)
return 0;
p=p/10;
}
while(q)
{
n2=q%10;
if(n2>=B)
return 0;
q=q/10;
}
while(r)
{
n3=r%10;
if(n3>=B)
return 0;
r=r/10;
}
return 1;
}