大數運算 加法(C C 實現)

2021-08-04 03:39:31 字數 2662 閱讀 8206

前言

問題分析

將兩個數字的每一位分別存入兩個陣列:因為所給定的資料不是很大,這裡就開闢長度為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個位元組,取值範圍在...