问题描述
6 X 9 =42 对于十进制来说是错误的,但是对于二进制来说是正确的。即6(13) X 9(13) = 42(13),而42(13) = 4 X 13^1 + 2 X 13^0 = 54(10)。你的任务就是写一段程序读入3个整数p、q 和 r,然后确定一个进制B(2<=B<=16)使得p X q = r。如果B有很多选择,输出最小的一个。例如:p=11,q=11,r=121。则有11(3) X 11(3) = 121(3),因为11(3) = 1 X 3^1 + 1 X 3^0 = 4(10) 和 121(3) = 1 X 3^2 + 2 X 3^1 +1 X 3^0 = 16(10)。对于十进制,有11(10) X 11(10) = 121(10)。这种情况下,应该输出3。如果没有合适的进制,则输出0。输入数据
输入有T组测试样例。T在第一行给出。每一组测试样例占一行,包含3个整数p、q、r。p、q、r的所有位都是数字,并且1<=p、q、r<=1 000 000。输出要求
对于每个测试样例输出一行。该行包含一个整数:即使得p x q = r成立的最小的B。如果没有合适的B,则输出0.输入样理
3
6 9 42
11 11 121
2 2 2输出样例
13
3
0解题思路
此问题很简单。选择一个进制B,按照该进制将被乘数、乘数、乘积分别转换成十进制,然后判断等式是否成立。使得等式成立的最小B就是所求的结果。
分别用一个字符型数组存储p、q、r 的各位数字字符。先以字符串的方式读入p、q、r,然后按不同的进制将它们转换成十进制数,判断是否相等。参考程序
include<stdio.h>
include<string.h>
long b2ten(char* x, int b){ //x字符数组值,b进制的参数,功能是b进制转换为十进制数ret
int ret = 0;
int len = strlen(x);
for(int i = 0; i < len; i++){
if (x[i] - '0' >= b) return -1;
ret *= b;
ret +=x[i] - '0';
}
return (long)ret;
}
void main(){
int n;
char p[8],q[8],r[8];
long pAlgorism, qAlgorism, rAlgorism;
scanf("%d",&n);
while(n--){
scanf("%s%s%s",p,q,r);
for(int b = 2;b <= 16; b++) {
pAlgorism = b2ten(p,b);
qAlgorism = b2ten(q,b);
rAlgorism = b2ten(r,b);
if(pAlgorism == -1 || qAlgorism == -1 || rAlgorism == -1) continue;
if(pAlgorism * qAlgorism == rAlgorism) {
printf("%d\n",b);
break;
}
}
if(b == 17) printf("0\n");
}
}
常见错误
1. 在数制b(2<=b<=16)的表示中,每一位上的数字一定都比b小。每读入一组数据后,需要根据其中的数字,判断b的下限。在参考程序的b2ten 函数中,如果字符串x中存储的数字比b大、或者与b相等,则返回-1,表明:按照数制b,x中存储的表示形式是非法的,因此b不可能是所求的值。
2. 检查:在为找到合适的 b 时,是否输出0。