完美筆試的最後一題,只寫了個+,準備用+模擬*的,回來看網上的資料,發現自己寫得不對,於是回來花寫時間寫了下,各種心得。
實現思路很簡單,用陣列實現,同時用乙個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...