以下是我寫大數類的標頭檔案,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秒,否則會發生溢位。為...