二十进制数的加法
CSDN编程挑战里的题目
在二十进制中,我们除了使用数字0-9以外,还使用字母a-j(表示10-19),
给定两个二十进制整数,求它们的和。 输入是两个二十进制整数,且都
大于0,不超过100位; 输出是它们的和(二十进制),且不包含首0。我
们用字符串来表示二十进制整数。
可惜我提交了6次才正确,我想要确保有抽奖的可能,需要申请两个帐号,一个做炮灰,另一个一击命中.
1 #include <cmath> 2 #include <cstring> 3 #include <cstdio> 4 5 static int GetNum(char c) 6 { 7 if (c >= '0' && c <= '9') 8 { 9 return c - '0'; 10 } 11 else if (c >= 'a' && c <= 'z') 12 { 13 return c + 10 - 'a'; 14 } 15 else if (c >= 'A' && c <= 'Z') 16 { 17 return c + 10 - 'A'; 18 } 19 else 20 { 21 return -1; 22 } 23 } 24 25 static char GetChar(int num) 26 { 27 if (num >= 0 && num <= 9) 28 { 29 return '0' + num; 30 } 31 else 32 { 33 return 'A' + num - 10; 34 } 35 } 36 37 static void InverseString(char* szString) 38 { 39 unsigned int len = strlen(szString); 40 char c; 41 for (unsigned int i = 0; i < len/2; i++) 42 { 43 c = szString[i]; 44 szString[i] = szString[len - 1 - i]; 45 szString[len - 1 - i] = c; 46 } 47 } 48 49 static void Calculate(const char* szA, const char* szB, char* szDest, unsigned int jinzhi = 20) 50 { 51 bool ad = false; 52 unsigned int lenA = strlen(szA); 53 unsigned int lenB = strlen(szB); 54 55 unsigned int pos = 0; 56 int valueA; 57 int valueB; 58 int valueAdd; 59 60 while (pos < lenA || pos < lenB) 61 { 62 if (pos < lenA) 63 { 64 valueA = GetNum(szA[pos]); 65 } 66 else 67 { 68 valueA = 0; 69 } 70 71 if (pos < lenB) 72 { 73 valueB = GetNum(szB[pos]); 74 } 75 else 76 { 77 valueB = 0; 78 } 79 80 valueAdd = valueA + valueB; 81 if (ad) 82 { 83 valueAdd++; 84 } 85 ad = (valueAdd >= jinzhi); 86 87 if (ad) 88 { 89 valueAdd -= jinzhi; 90 } 91 92 szDest[pos] = GetChar(valueAdd); 93 pos++; 94 } 95 96 if (ad) 97 { 98 szDest[pos] = '1'; 99 pos++; 100 } 101 szDest[pos] = 0; 102 } 103 104 void CalculateRadix20(const char* x, const char* y, char* szDest) 105 { 106 char szA[256]; 107 char szB[256]; 108 109 strcpy(szA, x); 110 strcpy(szB, y); 111 112 InverseString(szA); 113 InverseString(szB); 114 115 Calculate(szA, szB, szDest); 116 InverseString(szDest); 117 }