Hdu 2100 Lovekey 模拟大数相加<进位转换..>
题意:
用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 #include <stdio.h> 2 #include <cstring> 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