uva 343 What Base Is This?
无意中看到了《Art of programming contest》 UVa的,感觉不错,还发现的一个大牛的博客,里面有UVA及ragional and world final 的很多解题报告
本想上去水一道题,谁知却被水了。
1 //20ms 2010-05-14 14:30:43
2 //wa(6) ce(1) ac(1)
3 //Type:基础算法进制转换
4 //key1:没有一进制
5 //key2:使用unsigned long long
6 #include <stdio.h>
7 #include <string.h>
8 #define NL 100
9
10 inline int get(char a)
11 {
12 if (a >= '0' && a<='9') return a-'0';
13 else return a-'A'+10;
14 }
15
16 unsigned long long did(char *s, int b, int L)
17 {
18 int i, j;
19 unsigned long long t = 0, b0 = 1;
20 i = L-1;
21 j = 0;
22 while (i >= 0) {
23 int k = get(s[i]);
24 t += k*b0;
25 b0 *= b;
26 i--;
27 }
28 return t;
29 }
30
31 int main()
32 {
33 char s1[NL], s2[NL];
34 int len1, len2, d1, d2;
35 int i;
36 while (scanf("%s%s", s1, s2) != EOF) {
37 len1 = strlen(s1);
38 len2 = strlen(s2);
39 d1 = 1;
40 i = 0;
41 int k;
42 while (i<len1) {
43 k = get(s1[i]);
44 if (k > d1) d1 = k;
45 i++;
46 }
47 d1++;
48 d2 = 1;
49 i = 0;
50 while (i<len2) {
51 k = get(s2[i]);
52 if (k > d2) d2 = k;
53 i++;
54 }
55 d2++;
56 int b1, b2;
57 bool suc = false;
58 for (b1 = d1; b1<=36; b1++) {
59 for (b2 = d2; b2<=36; b2++) {
60 unsigned long long L1 = did(s1, b1, len1);
61 unsigned long long L2 = did(s2, b2, len2);
62 if (L1 == L2) {
63 suc = true;
64 break;
65 }
66 }
67 if (suc) break;
68 }
69 if (suc) {
70 printf("%s (base %d) = %s (base %d)\n", s1, b1, s2, b2);
71 }else {
72 printf("%s is not equal to %s in any base 2..36\n", s1, s2);
73 }
74 }
75 return 0;
76 }