链接:题目:
总时间限制:
- 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。
样例输入- 样例输出
36 9 4211 11 1212 2 2 1330
代码:
1 #include2 #include 3 #include 4 #include 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 //p35 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 //q45 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 //r55 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< <<','< <<','< <
思路
1.读入信息,使用字符串式读入
2.转成10进制,注意如:121不可能为2进制,因为2不可能出现在2进制数中