前言
問題分析
將兩個數字的每一位分別存入兩個陣列:因為所給定的資料不是很大,這裡就開闢長度為10的陣列進行說明,a陣列(a)用來儲存數字a的每一位,b陣列(b)用來儲存數字b的每一位,c陣列(c)用來儲存計算的結果(在程式中開闢乙個新的陣列,陣列的每一位都是隨機數,所以需要將陣列初始化,把陣列的每一位都賦值為0)。 0
1234
5678
9a98
7654
3210
b567
8900
000c
0000
0000
00我們可以記錄下數字 a 最後一位所在陣列的位置,數字 b 最後一位所在陣列的位置,這樣雖然不會出現上面的問題了,但是在實際的計算過程中會很繁瑣,並伴隨著各種問題。接下來,我們換一種思路來將數字存入陣列(逆序存入),存入的結果如下表所示: 0
1234
5678
9a12
3456
7890
b987
6500
000c
0000
0000
00這樣的結果才是我們所需要的,接下來我們繼續來模仿列豎式的方法進行計算,c[n] = a[n] + b[n] + c[n], 如果結果大於等於10,我們就向前進一位。
執行完上述操作後,**變成如下所示: 0
1234
5678
9a12
3456
7890
b987
6500
000c
0111
1778
90
0123
4567
89a1
2345
6789
0b98
7650
0000
執行完上述操作後,我們可以得到這樣乙個表: 0
1234
5678
9a12
3456
7890
b011
1177
890
//這裡str1是字串,a是陣列
//逆序存入str1中的元素到a陣列
for(int i = strlen(str1) - 1, j = 0; i >= 0; i--)
a[j++] = str1[i] - '0';
//這裡str2是字串,b是陣列
//逆序存入str2中的元素到b陣列
for(int i = strlen(str2) - 1, j = 0; i >= 0; i--)
b[j++] = str2[i] - '0';
//執行完這兩個迴圈之後就完成了逆序存入的操作
2.相加和進製:兩個陣列的每一位都分別相加,再通過相加的結果判斷是否需要進製,maxn為陣列的長度,但是這樣的話,會有很多沒用意義的計算,就比如上文中的例子,a[9] + b[9]就是沒有意義的,後面會說到這個該如何優化。
//這裡的maxn是陣列的長度
for(int i = 0; i < maxn; i++)
}
3.結果的輸出:因為輸出的時候需要從陣列的最後一位向前輸出,也就是說會有很多前置的零,上文中的例子,如果直接輸出的話結果就是0987711110,但是我們並不需要前置0,所以在輸出結果的時候應該過濾掉前置0,也就是說在輸出的時候從第乙個不為0的位置開始輸出,實現這個的方式有很多,我是用以下的方式實現的輸出:
//這裡的maxn同上
int i;
//注意:這個for迴圈有乙個分號
for(i = maxn - 1; i >= 0 && b[i] == 0; i--);
if(i >= 0)
for( ; i >= 0; i--)
cout
<< b[i];
else
cout
<< 0;
cout
<< endl;
下面是完整的**:
#include
#include
#include
using
namespace
std;
const
int maxn = 1000;
char str1[maxn], str2[maxn];
int a[maxn], b[maxn];
void sum()
}//輸出結果
int i;
//過濾掉前置0
for(i = maxn - 1; i >= 0 && b[i] == 0; i--);
if(i >= 0)
for( ; i >= 0; i--)
cout
<< b[i];
//如果儲存結果的陣列中全部為0,上面的操作會過濾掉所有的0,不會有輸出,所以這裡輸出乙個0
else
cout
<< 0;
cout
<< endl;
}int main()
關於maxn
加1的原因:n位+n位的結果可能會是n+1位,舉個例子來說,如果計算999+111,實際的結果應該是1110,如果不加1,那麼輸出的結果就是110。
用max替換sum()函式中的一些邊界值即可。
大數運算 加法(C C 實現)
前言在很多情況下,c c 所提供的基本資料型別已經不能滿足我們的需求了,所以我們需要一種方法來解決一些大數的運算,在小學進行加法運算的時候,無論資料是什麼,有多少位,都通通採取列豎式的方法進行計算並得出結果,本文將使用陣列模擬列豎式計算來解決大數的加法運算。問題分析 首先我們先給定一組資料,來輔助說...
大數運算 加法
include include include void add const char a,const char b,char c if carry 0 result result length carry 0 while result length 0 c result result length...
大數運算 加法
究竟為什麼要用大數加法呢。我們來看下資料 bool型為布林型,佔1個位元組,取值0或1。bool型為int型,一般認為佔4個位元組,取值true false error。sbyte型為有符號8位整數,佔1個位元組,取值範圍在128 127之間。bytet型為無符號16位整數,佔2個位元組,取值範圍在...