题意:
用A~Z表示0~25..
给出2个200以内的XYZ-26进制数..即a0 a1 a2 a3……an
求出和..用XYZ-26进制表示..
其中XYZ-26 -> 10进制是m = a0 * 26^(n-1) + a1 * 26^(n-2) + … + an-3* 26^2 + an-2*26 + an-1
思路:
不用进行转换然后相加再换回去..
直接相加..
模拟进位..
Tips:
※可以直接把短的加到长的字符串上..eg:ABC+CD就是 ABC
+ CD
------------
BFL
※ 主要是进位的时候要考虑清楚..
※ 在长字符串上处理..就不用担心不知道该在前面保留多少位的问题了..
※ 输出去前导无意义 ‘A' 的时候要考虑到AAAAA的情况..最后输出'A'
Code:
View Code
1 #include2 #include 3 4 void add(char *a, char *b) 5 { 6 int i, j, k; 7 int len1, len2; 8 int tmp=0; 9 len1 = strlen(a), len2 = strlen(b);10 for(i = len1-1, j = len2-1; i >= 0;){11 if(j >= 0){12 a[i] = a[i] - 'A' + b[j] + tmp;13 tmp = 0;14 if(a[i] > 'Z'){15 a[i] -= ('Z' - 'A' + 1);16 tmp = 1;17 }18 --i, --j;19 }20 else{21 a[i] = a[i] + tmp;22 tmp = 0;23 if(a[i] > 'Z'){24 a[i] -= ('Z'-'A'+1);25 tmp = 1;26 }27 --i;28 29 }30 }31 if(tmp){32 for(i = len1; i >= 0; --i)33 a[i+1] = a[i];34 a[0] = 'B';35 }36 37 }38 39 void outPut(char *a)40 {41 int len = strlen(a);42 bool flag = false;43 for(int i = 0; i < len; ++i){44 if(a[i] != 'A') flag = true;45 if(flag) printf("%c", a[i]);46 }47 if(!flag) puts("A");48 else puts("");49 }50 51 int main()52 {53 char arr1[210], arr2[210];54 int len1, len2;55 while(scanf("%s %s", arr1, arr2) != EOF)56 {57 len1 = strlen(arr1);58 len2 = strlen(arr2);59 if(len1 > len2){60 add(arr1, arr2);61 outPut(arr1);62 }63 else{64 add(arr2, arr1);65 outPut(arr2);66 }67 }68 return 0;69 }
高精度到此完一段落了..其实还有几题没做..到时候再说吧~Hdu 1250 1297 1905