[问题] 自己做的大数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