问题描述: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; }