编译环境:MinGW5.1.6
1.大数加法函数实现思路
1)函数输入:字符串形式的数字a和b
2)翻转字符串a和b,这样可以使两个数字的末位对其,利于逐位加法运算
3)将a和b中各位相加,和赋值到字符串sum对应位中,如果有进位则sum中的下一位自增1
4)将字符串a、b、sum翻转,a和b会翻转为它们原来的样子,sum即数字a与b的和
5)去掉sum前面多余的0
6)函数输出:字符串形式的数字sum
2.函数体(包括翻转字符串用的函数Reverse和加法函数Add)
///翻转一个字符串/* *@param char s[] 被翻转的字符串 *@return char* 翻转后的字符串 */char* Reverse(char s[]){ int i = 0, j = strlen(s) - 1; char temp; while(i < strlen(s) / 2) { temp = s[i]; s[i] = s[j]; s[j] = temp; i++; j--; } return s;}///两个字符串表示的大数的加法运算/* *@param char a[] 加数1 *@param char b[] 加数2 *@return char* 和 */char* Add(char a[], char b[]){ int i, j; char* sum = new char[1001]; //翻转数组a和b Reverse(a); Reverse(b); //两数组共有的位 sum[0] = '0'; for(i = 0; i < strlen(a) && i < strlen(b); i++) { sum[i + 1] = '0'; sum[i + 2] = 0; sum[i] += (a[i] - '0') + (b[i] - '0'); if(sum[i] > '9') { sum[i] -= 10; sum[i + 1] ++; } } //如果a的位数比b多,考虑a的高位 if(strlen(a) > strlen(b)) { for(i = strlen(b); i < strlen(a); i++) { sum[i + 1] = '0'; sum[i + 2] = 0; sum[i] += (a[i] - '0'); if(sum[i] > '9') { sum[i] -= 10; sum[i + 1] ++; } } } //如果b的位数比a多,考虑b的高位 else if(strlen(b) > strlen(a)) { for(i = strlen(a); i < strlen(b); i++) { sum[i + 1] = '0'; sum[i + 2] = 0; sum[i] += (b[i] - '0'); if(sum[i] > '9') { sum[i] -= 10; sum[i + 1] ++; } } } //翻转数组sum Reverse(sum); //复原数组a和b Reverse(a); Reverse(b); //去掉前面多余的0 while(*sum == '0') { sum += 1; } return sum;}
3.函数调用
输入迭代次数times。输入两个数a和b,程序返回a与b的和,迭代times次。
int main(){ char a[1000], b[1000]; //指定循环次数 int counter, times; cin >> times; for(counter = 1; counter <= times; counter ++) { //输入两个数字并求和 cin >> a >> b; cout << "Case " << counter << ':' << endl; cout << a << " + " << b << " = " << Add(a, b) << endl; if(counter != times) { cout << endl; } } return 0;}
4.运行结果
END