[問題] 自己做的大數class(解精華區2-12 Q5,6)

作者: wtchen (沒有存在感的人)   2015-05-25 22:24:05
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Lubuntu 15.04 + g++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
sys/time.h
問題(Question):
感謝各位先進對於operator overloading的指導
這是我為了解精華區2-12 問題5-6所做的class: BigNumber
問題5:
100 的 階乘是多少?
要精確到 每一位?
問題6:
強迫使用遞回呼叫的方式求 費氏數列。
第幾項: 0, 1, 2, 3, 4, 5
答案: 1, 1, 2, 3, 5, 8, 13, . . .
請問:第 100項的答案是 多少?
必須精確到 每一個 位數,
請問:你的程式 需要花多少時間完成?
精確度要 小於 0.1秒
我想直接做個可以跟一般unsigned int乘除而且能跟同class的加減應該就OK了
拙作程式碼同步分享在此:
https://gist.github.com/gnitnaw/79ccbac48a22e14b67c4
Feis大大的建議相當有用,把+-*/%放在class外的確方便很多
這邊想問個問題,我有另外為這個class覆寫<<operator
所以BigNumber a(0); cout << a << endl; 這樣是OK的。
那如果我想要讓
BigNumber a(0), b(0); cout << a+b << endl;
也能成功,有其他辦法嗎?
(因為如果a,b是type double或int,這樣是沒啥問題的)
謝謝。
#include <vector>
#include <iostream>
#include <sstream>
#include <math.h>
#include <sys/time.h>
using namespace std;
class BigNumber {
private :
vector <unsigned long> blocks;
static const unsigned long limitBlock = 10000000000;
const unsigned int nB = log10l(limitBlock);
public :
BigNumber(unsigned long n){
blocks.push_back(n%limitBlock);
if (n>=limitBlock) blocks.push_back(n/limitBlock);
}
size_t getNBlocks() const {
return blocks.size();
}
string getStringBlock(size_t i) const{
stringstream ss;
ss << blocks[i];
string convert_str;
ss >> convert_str;
if (blocks.size() == 1) return convert_str;
else {
if (i == blocks.size()-1) return convert_str;
else {
if (blocks[i]==0) {
for (unsigned int j(0); j<nB-1; ++j) {
convert_str += "0";
}
} else if (convert_str.size() < nB) {
for (unsigned int j(0); j<=(nB-convert_str.size()); ++j) {
convert_str = "0" + convert_str;
}
}
}
return convert_str;
}
}
int getNDigit() const {
int a=0;
for (size_t i(0); i<blocks.size(); ++i) {
a += getStringBlock(i).size();
}
return a;
}
void print(ostream& out) const {
for (int i(blocks.size()-1); i>=0;
作者: Feis (永遠睡不著 @@)   2015-05-25 23:50:00
ostream& operator<<(ostream &out, const BigNumber &n)
作者: wtchen (沒有存在感的人)   2015-05-26 00:24:00
喔喔!我了解了,謝謝你。
作者: softseaweed (Gladys von Wackenheim)   2015-05-26 00:56:00
其實費式數列有direct function 可以不用遞回的抱歉 沒看到你在解任務
作者: wtchen (沒有存在感的人)   2015-05-26 01:30:00
任務規定要用遞迴(汗)精華區2-12 Q7也解了,不過因為太簡單了就不分享了
作者: Killercat (殺人貓™)   2015-05-26 10:47:00
建議這種東西以後丟gist 大家會比較容易看懂
作者: wtchen (沒有存在感的人)   2015-05-26 15:23:00
我有阿....
作者: Killercat (殺人貓™)   2015-05-27 09:19:00
er...我眼殘了只看到程式碼 抱歉 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com