题目不难,要注意的细节挺多的。 我用的思路是这样: 先把字符转成数字, 做加法,20进制,注意进位 再把得到的数字转成字符 #include<iostream> #include<cstring> using namespace std; const int MAX_SIZE = 104; // for alignment char A[MAX_SIZE]; char B[MAX_SIZE]; char C[MAX_SIZE]; inline void char2int( char * a, int n) { for( int i=0; i<n; i++) { if( a[i] > 'A') // a,b,... a[i] = a[i] - 'a' + 10; else // 0,1,... a[i] = a[i] - '0'; } return; } inline void int2char( char * a, int n) { /* static char map[20] = { '0','1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f','g','h','i','j'}; */ static char map[] = "0123456789abcdefghij"; for( int i=0; i< n; i++) a[i] = map [ a[i] ]; return; } int martianadd( char * a, int la, char *b, int lb, char *c) { char * ap = a + la -1; char * bp = b + lb -1; char * cp = c; int carry = 0; while( ap >= a && bp >= b) { *cp = *ap + *bp + carry; carry = *cp / 20; *cp %= 20; ap--, bp--; cp++; } if( ap >= a ) { while( ap >= a && carry > 0) { *cp = *ap + carry; carry = *cp / 20; *cp %= 20; cp++,ap--; } while( ap >= a) { *cp = *ap; cp++,ap--; } } if( bp >= b ) { while( bp >= b && carry > 0) { *cp = *bp + carry; carry = *cp / 20; *cp %= 20; cp++,bp--; } while( bp >= b) { *cp = *bp; cp++,bp--; } } while( carry > 0) { *cp = carry; carry = *cp / 20; *cp %= 20; cp++; } return cp - c; } inline void dumpresult( char *c, int lc) { char * cp = c + lc -1; while( cp >= c) cout<< *(cp--); cout<<endl; } int main( void) { while( cin.getline( A, MAX_SIZE) && cin.getline( B, MAX_SIZE) ) { int la = strlen( A); int lb = strlen( B); int lc; char2int( A, la); char2int( B, lb); lc = martianadd( A, la, B, lb, C); int2char( C, lc); dumpresult( C, lc); } return 0; }