【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
编译环境: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
来源:oschina
链接:https://my.oschina.net/u/1425762/blog/299400