问题描述:6*9=42 对十进制来说是错误的 但是对13进制来说却是正确的 即6(13)*9(13)=42(13)
42(13)=4*13+2*1=54;你的任务是编写一段程序 读入3个整数,p,q和r 然后确定一个进制B(2<=B<=16),使得p*q=r。如过B有很多选择 则输出最小的那个进制
如果没有合适的进制,则输出0
输入:
输入有t组数据,t在第一行给出。1《=p,q,r<=1000000;
输出:
对于每一次测试样例输出第一行。该行包含一个整数:即令p*q=r成立的最小的B
输入样例:
3
6 9 42
11 11 121
2 2 2
输入样例
13
3
0
思路:先假设等式为B进制,讲三个数先转换为十进制,利用十进制的乘法计算等式左边的结果,在与十进制的r进行比较,找到相应的B值;若不相等则取B=B+1再来一遍。若B>16,则说明没有合适的进制能使等式成立
技巧:
B不一定要从2开始遍历 由r=n%k我们可以知道 r一定是要小于k的 所我们只需要找到表达式三个数所含数字中最大的那个值,B则从那个值+1开始遍历
#include<stdio.h>
int max_num(int n)
{
int max=0;
while(n)
{
int k=n%10;
if(k>max)
max=k;
n/=10;
}
return max;
}
int ic_xy(int n,int p)
{
int k=1,r;
int sum=0;
while(n)
{
r=n%10;
n/=10;
sum+=r*k;
k*=p;
}
return sum;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int amax,bmax;
amax=max_num(a);
bmax=max_num(b);
if(bmax>amax)
amax=bmax;
bmax=max_num(c);
if(bmax>amax)
amax=bmax;
int da,db,dc;//10进制的a、b
for(amax++;amax<=16;amax++)
{
da=ic_xy(a,amax);
db=ic_xy(b,amax);
dc=ic_xy(c,amax);
if(da*db==dc)
break;
}
if(amax>16)
amax=0;
printf("%d\n",amax);
}
return 0;
}