大數加減法(C 實現)

2021-08-01 02:32:49 字數 3389 閱讀 6345

以下是我寫大數類的標頭檔案,cpp檔案,說明文件等,**可用,但限於筆者自身水平,也有諸多不足之處,有待日後改善。不過程式是沒有問題的,可以計算大數的加減乘運算。

readme.md :

程式名:bignumplus

程式功能:此程式針對任意整實數的加減乘運算,支援負值的計算。

程式檔案: bignum.h //定義大數類

bignum.cpp //實現大數的各種運算功能

main.cpp //測試檔案

程式的實現思路:

大數儲存方式是通過乙個int bignum陣列實現的,陣列下標對應數的位數。並增加了

len 和 sign成員表示大數的數值總位數 和 符號位。

程式是通過 成員函式turnstringtonum 將string 型別的字串轉化位大數的型別並儲存。

整個大數的加減乘運算,是以10進製的逢10進1,不夠借1的原則編寫的。

程式缺點:

1、沒有實現動態的記憶體分配,造成大量的記憶體浪費。

2、沒有實現除法的運算。

3、沒有實現輸入輸出流的過載。

4、以10進製的形式儲存程式好空間大,且效率低。

程式優點:

1、實現了符號支援,即可以負值運算。

2、實現了+、-、*的過載。

3、實現了加減乘的運算。

4、以10進製的形式儲存程式,運算思路簡單,程式**好理解。

bignum.h:

#ifndef bignum_h

#define bignum_h

#include

#include

#include

using

namespace

std;

#define max_size 500 //最大的位數控制

#define max(a,b) len>b.len?len:b.len//a,b中長度較大的

//此類是大數類,用以實現任意整數之間加減乘的運算

class bignum

;#endif // bignum_h

bignum.cpp:

#include "bignum.h"

//建構函式,初始化各個資料成員

bignum::bignum()

len=0;

sign='+';//ctor

}//析構函式

bignum::~bignum()

//此函式是將string型別的資料轉換成陣列儲存

bool bignum::turnstringtonum(string a)

}for(int i=0;i0;

len=a.size()-1;

for(int k=0;k<(signed)a.size()-1;k++)

return true;

}//無符號時預設符號位為+

else

if(isdigit(a[0]))

}//字串轉化為大數

for(int i=0;i0;

len=a.size();

for(int k=0;k<(signed)a.size();k++)

return true;

}//判斷符號是否正確

else

return false;

}//判斷a,b的數值的絕對值的大小

bool bignum::operator>=(bignum b)

if(i==len)return true;

}//當a的長度小於b的長度時

else

return false;

return false;

}//此函式是實現大數的加法演算法

bignum bignum::operator+(bignum b)

//否則不進

else

}return result;

}//第二種情況

if((sign=='-' && b.sign=='+')||(sign=='+' && b.sign=='-'))

//否則不借

else}}

//2if(b>=(*this))

else}}

return result;

}return result;

}//此函式是實現大數的減法

bignum bignum::operator-(bignum b)

else}}

if(b>=(*this))

else}}

return result;

}//第二種情況

if((sign=='-' && b.sign=='+')||(sign=='+' && b.sign=='-'))

else

}return result;

}return result;

} //此函式是實現大數的乘法

bignum bignum::operator*(bignum b)

//否則進製

else

}//將每層累加

temp[i].sign=result.sign;

result=result+temp[i];

}delete temp; //釋放記憶體

return result;

}//賦值運算子過載

bignum bignum::operator= (bignum other)

this->len=other.len;

this->sign=other.sign;

return

*this;

}//此函式用來列印大數

void bignum::printall()

else

break;

}if(nu==len)cout<<"0"

cout#include

#include"bignum.h"

using

namespace

std;

int main()

首先,我們要搞清楚大數的儲存方法,我這裡是開了乙個陣列bignum[max_size]來存放大數,即從下標0開始,向前存放大數的每一位上的數值,我們知道每一位上的數不可能超過10,所以每位就是0~9,另外還要封裝len,表示數值的位數(方便操作),還要符號位sign定義大數的符號正負。turnstringtonum函式是將string型別的輸入資料轉化為大數儲存。另外,大數的加法是通過逢10進1的思路實現,減法通過不夠10借1實現。**有注釋,不在重複贅述。這裡說下乘法,我們知道乘法列豎式計算時,是下面的乘數從個位開始與上面的乘數相乘,且得到的數錯位相加得到的。依照這個思路,我們要另外開臨時的陣列來儲存這些需要錯位相加的數,具體演算法看**。這裡提供幾個比較好的部落格:

c 大數加減法的實現

輸入 第一行,輸入乙個正整數 t 1 t 30 然後有t行,每行兩個整數 a 和 b 輸出對於每對 a和b,輸出 a b 的結果 樣例輸入 41 2 5 3 1 1 1111111111111 2222222222222 樣例輸出3 2 01111111111111 題目 源 include inc...

時間加減法

include stdafx.h include windows.h typedef struct tagmydate mydate 用於表示兩個時間之間的差值,負值表示慢,正值表示快 typedef struct tagtimedistance timedistance int month day...

時間加減法

1.相關資料結構 首先看time.h檔案中隊time t的定義 可以看出time t實際上是乙個整數,它記錄了儲存的是從1970年1月1日0時0分0 秒到現在經過的秒數。這裡有一點要注意,對time t資料型別的值來說,它所表示的時間不能晚於2038年1月18日19時14分07秒,否則會發生溢位。為...