轉載:http://www.du52.com/text.php?id=411
在這個大數據的年代里,我們不可避免會遇到兩個超越正常數據類型(如int,long,long long)的整數相加。顯然兩個大數據已經不能使用傳統的加號直接相加,但是相加的原理仍然是不變的,就是簡單的同位相加,超9進1.接下來我們將敘述用數組保存的大數據相加的代碼。
/* 大數相加:超越數據類型范圍的也可以進行相加分析: 用一維數組解決 1.數據元素的輸入 用getchar無限輸入字符 ,從下標0開始 保存元素 保存順序是高位在前,低位在后,輸入123保存a1[0]=1....這里也要把字符轉換為整形,關系 整數1+'0' ='1' 2.一但遇到進位問題,上面這種就會溢出,數據無法完全保存,所有 把上面的存儲順序改成是 低位在前,高位在后如輸入123 a[0]=3,a[1]=2 3.相加操作 :把每一位進行相加 這里用已存在的數字對相加結果進行保存,輸入的數可能長度不一,所有數組長度要取最輸入最長的4.相加進位問題:因是每一位相加,結果可能會大于9,大于9的就要進行進位操作,其它的不變5.顯示輸出結果問題:可能會出現少位數或多位數的,這里就用一變量ncount解決 */
#include<iostream>
using namespace std;int main()
{int a1[100];int b1[100];int a[100]={0};int b[100]={0};int na ,nb; //保存數組元素的長度 int ncount = 0; //相加后的數組共有多少個元素 int i,j;i = 0;j = 0;輸入數據// cout<<"請輸入加數:";while ( (a1[i]=getchar()) !='\n' ) //下標小的保存高位 { a1[i] = a1[i]-'0';i++;}///轉換存儲順序 na = i; //保存數組中存入了多少個有效元素 na-1個 for (int k=0,i=na-1; i>=0; i--) // //下標小的保存低位 {a[i] = a1[k];k++;}cout<<"輸入被加數:";while ( (b1[j]=getchar()) !='\n' ){b1[j] = b1[j]-'0';j++;}nb = j; //保存數組中存入了多少個有效元素 nb-1個///轉換存儲順序 for (int k=0,j=nb-1; j>=0; j--) // //下標小的保存低位 {b[j] = b1[k];k++;}// 取得保存相加結果數組的長度/* 如輸入123+23 我們就要取大數字的位數作為 保存結果數組的小標 不這樣就會丟失數據 */ int lengh ; //取數組元素最長的作為保存相加后的結果if (na>=nb){lengh = na;} else{lengh = nb;}// 開始執行加法操作for (int m=0; m<lengh; m++){a[m] = a[m] + b[m]; //兩數進行相加 每一位相加 } ///進位處理 ////*如 98+7 就要進位 數據保存如下:a[0]=8 ,a[1]=9; b[0]=7 執行上面的相加操作 結果為: a[0]=a[0]+b[0]=15 ,a[1]=a[1]+b[1] = 9+0=9下面為進位處理 lengh =2a[0]=15 a[1]=91. n=0 a[0]>9 需進位temp=15/10=1 a[1]=a[1]+temp =9+1=10 a[0]=15%10=52.n=1 a[1]=10>9 continuetemp = 10/10=1 a[2]=0+1=1 a[1]=10%10=03.n=2 等于lengh 所有退出 這時相加的結果為:a[0]=5 a[1]=0 a[2]=1 輸出就是105 */for (int n=0; n<lengh; n++) //進位處理 {if (a[n] >9){int temp = a[n]/10;a[n+1] = a[n+1] + temp;a[n] = a[n]%10;ncount = lengh; //進位的話 數組要多一位數字 ,實際上主要是判別是否是最后一位進位}else{ncount = lengh-1; //不進位保存結果的數組長度就是 輸入數字大的位數長 continue; //不進位就往下走 } }//輸出結果/// cout<<"相加結果是:";for (int i=ncount; i>=0; i--) //ncout 解決了顯示輸出結果問題:可能會出現少位數或多位數 {cout<<a[i];}cout<<endl; system("pause");return 0;
}