例25 确定进制
问题描述
6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的。即
6(13)* 9(13)= 42(13),因为,在十三进制中,42 = 4 * 13 + 2 = 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(10)* 11(10)= 121(10)。这种情况下,输出3。如果没有合适的进制,则输出0。
输入格式
三个整数p、q和r。
输出格式
所确定的进制B。如果没有合适的进制,则输出0。
输入样例
6 9 42
输出样例
13
(1)编程思路。
选择一个进制B,按照该进制将被乘数p、乘数q、乘积r分别转换成十进制数pb、qb和rb。然后判断等式pb*qb==rb是否成立。使得等式成立的最小B就是所求的结果。
设n位B进制数num=(an-1an-2……a1a0),将其按权值展开后求和就可得到对应的十进制数ret。
由上式可以看出,B进制数num转换为十进制数ret可以写成一个循环。方法是:另ret初始值为0,从高位到低位循环分离出num的各位数字digit,执行 ret=ret*b+digit,循环结束就可得B进制数num对应的十进制数ret。
编写函数int b2ten(int num,int b)完成b进制数num转换为十进制数。
由于转换时需要从高位向低位分离数字,而用循环
while (num!=0)
{
digit = num%10;
num = num/10;
}
能方便地完成从低位向高位分离出num的各位数字。因此,可采用一个数组digit[]来保存从低位向高位分离出的各位数字,同时num中数字的位数保存到变量cnt中。
(2)源程序。
#include
int b2ten(int num,int b);
int main()
{
int b,p,r,q;
int pb,qb,rb; // 用来存储转换为十进制后的结果
scanf("%d%d%d",&p,&q,&r);
for(b=2;b<=16;b++)
{
pb=b2ten(p,b);
qb=b2ten(q,b);<