超大整數(shù)的加法運(yùn)算
所謂超大數(shù)就是int, 甚至long int等數(shù)據(jù)類型無(wú)法直接對(duì)其存儲(chǔ)的整數(shù)。對(duì)于這種超大數(shù)的加法運(yùn)算,我的解決方案是:
首先將輸入的大數(shù)轉(zhuǎn)化為字符串存儲(chǔ)起來(lái),這樣一來(lái),字符串的首字符就對(duì)應(yīng)著大數(shù)的最高位,末字符就對(duì)應(yīng)大數(shù)的最低位。
然后,從兩個(gè)字符串的末尾開(kāi)始取出一個(gè)字符,將其轉(zhuǎn)化為一個(gè)一位整數(shù)后進(jìn)行相加(這里相加的時(shí)候還需要加上進(jìn)位標(biāo)志的值),這樣將產(chǎn)生兩種情況:
一、相加后大于等于10,需要進(jìn)1位。
二、相加后小于10,不需要進(jìn)位。
待對(duì)兩個(gè)字符串中的所有位字符都處理完成后,就得到了一個(gè)相加的結(jié)果字符串,這個(gè)結(jié)果字符串的不足之處是按低位到高位的順序排列的。所以還得對(duì)其高低位的對(duì)應(yīng)字符進(jìn)行交換處理,從而得出正確的結(jié)果和字符串。。。
大數(shù)相加的函數(shù)C代碼如下:
首先將輸入的大數(shù)轉(zhuǎn)化為字符串存儲(chǔ)起來(lái),這樣一來(lái),字符串的首字符就對(duì)應(yīng)著大數(shù)的最高位,末字符就對(duì)應(yīng)大數(shù)的最低位。
然后,從兩個(gè)字符串的末尾開(kāi)始取出一個(gè)字符,將其轉(zhuǎn)化為一個(gè)一位整數(shù)后進(jìn)行相加(這里相加的時(shí)候還需要加上進(jìn)位標(biāo)志的值),這樣將產(chǎn)生兩種情況:
一、相加后大于等于10,需要進(jìn)1位。
二、相加后小于10,不需要進(jìn)位。
待對(duì)兩個(gè)字符串中的所有位字符都處理完成后,就得到了一個(gè)相加的結(jié)果字符串,這個(gè)結(jié)果字符串的不足之處是按低位到高位的順序排列的。所以還得對(duì)其高低位的對(duì)應(yīng)字符進(jìn)行交換處理,從而得出正確的結(jié)果和字符串。。。
大數(shù)相加的函數(shù)C代碼如下:
/*
*功能:addBigNum函數(shù)的功能為對(duì)兩個(gè)大數(shù)進(jìn)行相加運(yùn)算。
*參數(shù):pa, pb指向需要相加的兩個(gè)大數(shù)的字符串表示。
* psum指向的緩沖區(qū)用來(lái)存儲(chǔ)相加的結(jié)果和的字符串表示。
*返回值:無(wú)
*/
void addBigNum(char *pa, char *pb, char *psum)
{
int indexa, indexb, index;
int sum, addone;
addone = 0; //向高位進(jìn)一標(biāo)志
index = 0; //psum的位置索引
//indexa, indexb分別索引到字符串stra, strb的最后一個(gè)字符
indexa = strlen(pa) - 1;
indexb = strlen(pb) - 1;
for ( ; indexa >= 0 || indexb >= 0; indexa--, indexb--) {
//處理字符串長(zhǎng)度不同的運(yùn)算
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) {
//兩個(gè)一位數(shù)組相加最多向高位進(jìn)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)
{
//對(duì)str指向的字符串中的字符進(jìn)行逆向重排.
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;
}
}
*功能:addBigNum函數(shù)的功能為對(duì)兩個(gè)大數(shù)進(jìn)行相加運(yùn)算。
*參數(shù):pa, pb指向需要相加的兩個(gè)大數(shù)的字符串表示。
* psum指向的緩沖區(qū)用來(lái)存儲(chǔ)相加的結(jié)果和的字符串表示。
*返回值:無(wú)
*/
void addBigNum(char *pa, char *pb, char *psum)
{
int indexa, indexb, index;
int sum, addone;
addone = 0; //向高位進(jìn)一標(biāo)志
index = 0; //psum的位置索引
//indexa, indexb分別索引到字符串stra, strb的最后一個(gè)字符
indexa = strlen(pa) - 1;
indexb = strlen(pb) - 1;
for ( ; indexa >= 0 || indexb >= 0; indexa--, indexb--) {
//處理字符串長(zhǎng)度不同的運(yùn)算
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) {
//兩個(gè)一位數(shù)組相加最多向高位進(jìn)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)
{
//對(duì)str指向的字符串中的字符進(jìn)行逆向重排.
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;
}
}
posted on 2009-06-30 16:02 Marcky 閱讀(1021) 評(píng)論(0) 編輯 收藏 引用 所屬分類: C/C++