所谓超大数就是int, 甚至long int等数据类型无法直接对其存储的整数。对于这种超大数的加法运算,我的解决方案是:
首先将输入的大数转化为字符串存储起来,这样一来,字符串的首字符就对应着大数的最高位,末字符就对应大数的最低位。
然后,从两个字符串的末尾开始取出一个字符,将其转化为一个一位整数后进行相加(这里相加的时候还需要加上进位标志的值),这样将产生两种情况:
一、相加后大于等于10,需要进1位。
二、相加后小于10,不需要进位。
待对两个字符串中的所有位字符都处理完成后,就得到了一个相加的结果字符串,这个结果字符串的不足之处是按低位到高位的顺序排列的。所以还得对其高低位的对应字符进行交换处理,从而得出正确的结果和字符串。。。
大数相加的函数C代码如下:
/*
*功能:addBigNum函数的功能为对两个大数进行相加运算。
*参数:pa, pb指向需要相加的两个大数的字符串表示。
* psum指向的缓冲区用来存储相加的结果和的字符串表示。
*返回值:无
*/
void addBigNum(char *pa, char *pb, char *psum)
{
int indexa, indexb, index;
int sum, addone;
addone = 0; //向高位进一标志
index = 0; //psum的位置索引
//indexa, indexb分别索引到字符串stra, strb的最后一个字符
indexa = strlen(pa) - 1;
indexb = strlen(pb) - 1;
for ( ; indexa >= 0 || indexb >= 0; indexa--, indexb--) {
//处理字符串长度不同的运算
if (indexa >= 0 && indexb >= 0) {
sum = (pa[indexa] - '0') + (pb[indexb] - '0') + addone;
} else if (indexa >= 0 && indexb < 0) {
sum = (pa[indexa] - '0') + addone;
} else if (indexa < 0 && indexb >= 0) {
sum = (pb[indexb] - '0') + addone;
}
if (sum >= 10) {
//两个一位数组相加最多向高位进1
psum[index++] = sum - 10 + '0';
addone = 1;
} else {
psum[index++] = sum + '0';
addone = 0;
}
}
psum[index] = '\0';
swapStr(psum);
return;
}
void swapStr(char *str)
{
//对str指向的字符串中的字符进行逆向重排.
int len, i;
char temp;
len = strlen(str);
for (i = 0; i < len / 2; i++) {
temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
}