题目连接:http://poj.grids.cn/practice/2972/
1 /* 功能Function Description: 2 开发环境Environment: DEV C++ 4.9.9.1 3 技术特点Technique: 4 版本Version: 5 作者Author: 可笑痴狂 6 日期Date: 20120730 7 备注Notes: 8 描述 9 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。 10 输入 11 输入有 T组测试样例。 T在第一行给出。每一组测试样例占一行,包含三个整数p、q、r。 p、q、r的所有位都是数字,并且1 <= p、q、r <= 1,000,000。 12 输出 13 对于每个测试样例输出一行。该行包含一个整数:即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。 14 样例输入 15 3 16 6 9 42 17 11 11 121 18 2 2 2 19 样例输出 20 13 21 3 22 0 23 */ 24 25 26 #include<stdio.h> 27 #include<math.h> 28 29 int findmin(int p,int q,int r)//寻找p、q、r三个数中每位上最大的数字max,则该数的进制数一定大于max 30 { 31 int max=0; 32 while(p) 33 { 34 if(p%10>max) 35 max=p%10; 36 p/=10; 37 } 38 while(q) 39 { 40 if(q%10>max) 41 max=q%10; 42 q/=10; 43 } 44 while(r) 45 { 46 if(r%10>max) 47 max=r%10; 48 r/=10; 49 } 50 return max; 51 } 52 53 int change(int num,int i) //把i进制数num转化十进制数返回 54 { 55 int sum,b; 56 sum=b=0; 57 while(num) 58 { 59 sum+=num%10*pow(i,b++); 60 num/=10; 61 } 62 return sum; 63 } 64 65 int main() 66 { 67 int T,i,p,q,r,t1,t2,t3; 68 scanf("%d",&T); 69 while(T--) 70 { 71 scanf("%d%d%d",&p,&q,&r); 72 i=findmin(p,q,r)+1; //i为可能的最小进制数 73 for(;i<=16;++i) 74 { 75 t1=change(p,i); 76 t2=change(q,i); 77 t3=change(r,i); 78 if(t1*t2==t3) 79 break; 80 } 81 if(i>16) 82 printf("0\n"); 83 else 84 printf("%d\n",i); 85 } 86 return 0; 87 }