链接:http://poj.grids.cn/practice/2972/题目:
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 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。
- 输入
- 输入有 T组测试样例。 T在第一行给出。每一组测试样例占一行,包含三个整数p、q、r。 p、q、r的所有位都是数字,并且1 <= p、q、r <= 1,000,000。
- 输出
- 对于每个测试样例输出一行。该行包含一个整数:即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。
- 样例输入
3 6 9 42 11 11 121 2 2 2- 样例输出
13 3 0
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 using namespace std; 6 7 const int MAX = 8; 8 const int LEFT = 2; 9 const int RIGHT = 16; 10 11 int main() 12 { 13 //freopen("F:\\input.txt","r",stdin); 14 15 int t; 16 cin>>t; 17 18 char p[MAX]; 19 char q[MAX]; 20 char r[MAX]; 21 22 while(t--) 23 { 24 scanf("%s %s %s",p,q,r); 25 26 27 int i,j; 28 int p10,q10,r10; 29 30 for(i = LEFT; i <= RIGHT; i++) 31 { 32 //i进制装成10进制 33 34 //p 35 p10 = 0; 36 int len_p = strlen(p); 37 for(j = 0; j < len_p; j++) 38 { 39 p10 = p10 * i + (p[j] - '0'); 40 if(p[j] - '0' >= i) break; 41 } 42 if(j < len_p) continue; 43 44 //q 45 q10 = 0; 46 int len_q = strlen(q); 47 for(j = 0; j < len_q; j++) 48 { 49 q10 = q10 * i + (q[j] - '0'); 50 if(q[j] - '0' >= i) break; 51 } 52 if(j < len_q) continue; 53 54 //r 55 r10 = 0; 56 int len_r = strlen(r); 57 for(j = 0; j < len_r; j++) 58 { 59 r10 = r10 * i + (r[j] - '0'); 60 if(r[j] - '0' >= i) break; 61 } 62 if(j < len_r) continue; 63 64 if( p10 * q10 == r10) break; 65 //cout<<p10<<','<<q10<<','<<r10<<endl; 66 } 67 68 if(i <= RIGHT) 69 { 70 cout<<i<<endl; 71 } 72 else 73 { 74 cout<<'0'<<endl; 75 } 76 } 77 return 0; 78 }
思路
1.读入信息,使用字符串式读入
2.转成10进制,注意如:121不可能为2进制,因为2不可能出现在2进制数中