所謂超大數就是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;
}
}