您的位置:首页 > 其它

相邻数字的基数等比:确定进制

2016-06-15 00:51 246 查看
问题描述

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: