-
时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
- 6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的。即, 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)。 对于进制 10,有 11(10) * 11(10) = 121(10)。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。 输入
- 输入有 T组测试样例。 T在第一行给出。每一组测试样例占一行,包含三个整数p、q、r。 p、q、r的所有位都是数字,并且1 <= p、q、r <= 1,000,000。 输出
- 对于每个测试样例输出一行。该行包含一个整数:即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。 样例输入
-
3 6 9 42 11 11 121 2 2 2
样例输出
-
13 3 0
#include<cstdio>
#include<string.h>
#include<iostream>
using namespace std;
char p[8];
char q[8];
char r[8];
bool judge(int b){
int np=0,nq=0,nr=0,i;
for(i=0;p[i]!='\0';i++){
np*=b;
if((p[i]-'0')>=b)
return false;
else
np+=(p[i]-'0');
}
for(i=0;q[i]!='\0';i++){
nq*=b;
if((q[i]-'0')>=b)
return false;
else
nq+=(q[i]-'0');
}
for(i=0;r[i]!='\0';i++){
nr*=b;
if((r[i]-'0')>=b)
return false;
else
nr+=(r[i]-'0');
}
if(np*nq==nr)
return true;
else
return false;
}
int main(){
int t,b;
scanf("%d",&t);
while(t--){
scanf("%s%s%s",p,q,r);
for(b=2;b<=16;b++)
if(judge(b)){
printf("%d\n",b);
break;
}
if(b==17)
printf("0\n");
}
return 0;
}