大數的乘法與加法(C )

2022-03-04 05:10:22 字數 1679 閱讀 1327

完美筆試的最後一題,只寫了個+,準備用+模擬*的,回來看網上的資料,發現自己寫得不對,於是回來花寫時間寫了下,各種心得。

實現思路很簡單,用陣列實現,同時用乙個len表示占用空間,由於加法和乘法都要求對齊,所以按照數字的逆序表示要方便些,若要輸出的話逆向輸出即可(在此複習了下ostream 和friend 語義)。陣列是字串的集合,要保持字串的特有的'\0'結尾符。下面的**不求完美,但求思路,所以用了固定陣列,同時不支援負數形式。

加法的實現比較簡單,有點類似於歸併的**,注意最後要更新len和末尾結束符。

乘法借用的是網上的思路,用了乙個臨時陣列(注意大小,如何證明不會溢位?),這個陣列的型別有講究,剛開始我用的是char,結果算列印不對,debug printf後發現中間某些值成為了負數,於是果斷改為unsigned char,後來又對很大的數相乘,測試結果與windows自帶calc相比,發現中間某些位有些不一樣,如下(上面程式,下面calc):

1111103676526184449295339622

1111103676554600449295339622

於是想可能又是溢位問題,改成unsigned int型別後,得到與calc一致的結果。

附上乙個多小時的成果吧,批評指正。

bigint

#include 

#include

#include

#include

using

namespace std;

#define max 256

class bigint

private:

char vt[max];

size_t len;

};bigint::bigint(const

char *str)

bigint::bigint(const bigint &other):len(other.len)

bigint & bigint::operator = (const bigint &other)

bigint & bigint::operator +=(const bigint &other)

while(i < len)//

other較短

while(i < other.len)//

other較長

if(carrier)

vt[i++] = '1';

vt[i]='

\0';

//更新len的長度

len = i;

return *this;

}bigint & bigint::operator *= (const bigint &other)

//實現進製,一直到[i+j]都有值

for(size_t i = 0; i < total; ++i)

if(tmpvt[i]>=10)//

大於10

for(size_t i = 0; i < total; ++i)

vt[i] = tmpvt[i] + '0';

delete tmpvt;

//更新len的值,並保持字串的

len = total;

vt[len]='

\0';

return *this;

}ostream& operator

<

int main()

大數的加法與乘法

眾所周知,計算機的整數型別表示的範圍是有限的,因此,對於乙個很大的數,經常用陣列或者字串去表示。字串可以看做是字元陣列,本質上還是陣列表示大數。那麼,大數的加法和乘法該怎麼計算呢?這裡給出簡單的演算法 class solution if carry res.insert res.begin 0 ca...

大數加法,大數乘法

include include include typedef struct node pnode 函式宣告 int multiply char strmultipliera,char strmultiplierb,char strrst pnode initlist char strmultipl...

大數的加法乘法

大數自然不能用普通的int,或者long long.因為是肯定存不下的。所以就有兩個選擇,乙個是通過字串來進行運算,可以看之前的部落格。這裡只介紹通過陣列進行的運算。1.加法 比如要求 1234 456 的和,可將 1234 化為 a 0 4 表示該數有多少位 a 1 4,a 2 3,a 3 2,a...