UVA 343 What Base Is This?
来源:互联网 发布:java解压tar文件 编辑:程序博客网 时间:2024/05/19 15:44
/*---------------------------------------------------- Author : Johnsondu Stratege : 水题, 注意要用long long, 没有1进制 10000845343What Base Is This?AcceptedC++0.0162012-04-17 11:30:42----------------------------------------------------*/#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;typedef unsigned long long ll ;char str1[100], str2[100] ;int len1, len2 ;ll tmp1[40], tmp2[40] ;int res1[40], res2[40] ;int tmpLen1, tmpLen2 ;int maxDigit1, maxDigit2 ;bool flag ;int ba1, ba2 ;int max (int a, int b){ return a > b ? a : b ;}void getMaxDigit () // 找出每个串的最大数,如123,{ // 那么这个肯定只能从4进制开始 int i, j ; for (i = 0; i < len1; i ++) { if (str1[i] >= '0' && str1[i] <= '9') maxDigit1 = max(maxDigit1, str1[i] - '0') ; else if (str1[i] >= 'A' && str1[i] <= 'Z') maxDigit1 = max (maxDigit1, str1[i] - 'A' + 10) ; } for (i = 0; i < len2; i ++) { if (str2[i] >= '0' && str2[i] <= '9') maxDigit2 = max(maxDigit2, str2[i] - '0') ; else if (str2[i] >= 'A' && str2[i] <= 'Z') { maxDigit2 = max (maxDigit2, str2[i] - 'A' + 10) ; } }}void getValue () // 枚举每个值,保存在数组中{ int i, j ; ll tmp ; tmpLen1 = 0 ; tmpLen2 = 0 ; for (i = maxDigit1 + 1; i <= 36; i ++) { tmp = 0 ; for (j = 0; j < len1; j ++) { if (str1[j] >= '0' && str1[j] <= '9') tmp = tmp * i + (str1[j] - '0') ; else tmp = tmp * i + (str1[j] - 'A' + 10) ; } tmp1[tmpLen1] = tmp ; //保存值 res1[tmpLen1 ++] = i ; //保存进制 } for (i = maxDigit2 + 1; i <= 36; i ++) { tmp = 0 ; for (j = 0; j < len2; j ++) { if (str2[j] >= '0' && str2[j] <= '9') tmp = tmp * i + (str2[j] - '0') ; else tmp = tmp * i + (str2[j] - 'A' + 10) ; } tmp2[tmpLen2] = tmp ; res2[tmpLen2 ++] = i ; //保存进制 }}void compare (){ int i, j ; ba1 = 100 ; ba2 = 0 ; for (i = 0; i < tmpLen1; i ++) for (j = 0; j < tmpLen2; j ++) { if (tmp1[i] == tmp2[j]) //比较 { flag = true ; if (fabs (res1[i] - res2[j]) < fabs (ba1 - ba2)) //找出差值最小的 { ba1 = res1[i]; //结果1 ba2 = res2[j] ; //结果2 } } } return ;}void solve (){ maxDigit1 = 0 ; maxDigit2 = 0 ; flag = false ; getMaxDigit () ; getValue () ; compare () ;}int main (){ while (scanf ("%s %s", str1, str2) == 2) { len1 = strlen (str1) ; len2 = strlen (str2) ; solve () ; if (flag) { if (ba1 == 1) ba1 ++ ; if (ba2 == 1) ba2 ++ ; printf ("%s (base %d) = %s (base %d)\n", str1, ba1, str2, ba2) ; } else printf ("%s is not equal to %s in any base 2..36\n", str1, str2) ; } return 0 ;}
343 - What Base Is This?