本来想写一个大浮点数类,后来因为时间关系,只将浮点除法写了.其实除了除法有点难度外,加减乘均可借鉴
大整数类.
代码写得比较乱,因为时间比较急.
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
1
#include "BigInteger.h"
2
#include <iostream>
3
using namespace std;
4![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
5
class BigDecimal
6![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
7
private:
8
BigInteger divide;
9
BigInteger divided;
10
int digit_count;
11![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
12
BigInteger Divide()
13![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
14
if(divide == BigInteger(0))
15
return BigInteger(0);
16
BigInteger result;
17![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
18
BigInteger temp(0), index(0), rest(0), zero(0);
19
BigInteger TEN(10);
20
int end = -1;
21
int start = divide.Length() - 1;
22
vector<int> quotients;
23![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
24
// BUG: How to deal when the divide can't divide divided?
25
while(rest != zero || start > end)
26![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
27
temp = rest * TEN;
28
digit_count = start > end ? digit_count : digit_count + 1;
29
temp = start > end ? temp + BigInteger((int)(divide[start])) : temp;
30
if(start <= end && temp < divided)
31![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
32
quotients.push_back(0);
33
}
34
while(temp < divided)
35![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
36
--start;
37
temp = start > end ? temp * TEN + BigInteger((int)(divide[start])) : temp * TEN;
38
digit_count = start > end ? digit_count : digit_count + 1;
39
if(start <= end && temp < divided)
40![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
41
quotients.push_back(0);
42
}
43
}
44
int quotient = 0;
45
rest = temp;
46
while(rest >= divided)
47![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
48
rest = rest - divided;
49
++quotient;
50
}
51
quotients.push_back(quotient);
52
--start;
53
}
54
//--digit_count;
55![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
56
string r;
57
vector<int>::iterator i_end = quotients.end();
58
for(vector<int>::iterator ite = quotients.begin(); ite != i_end; ++ite)
59![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
60
r += (char)((*ite) + '0');
61
}
62
return BigInteger(r);
63
}
64![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
65
public:
66
BigDecimal()
67![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
68
digit_count = 0;
69
divide = 0;
70
divided = 1;
71
}
72![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
73
BigDecimal(BigInteger a, BigInteger b)
74![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
75
digit_count = 0;
76
divide = a;
77
divided = b;
78
}
79![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
80
friend ostream & operator<<(ostream & os, BigDecimal & decimal)
81![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
82
BigInteger result = decimal.Divide();
83
int length = result.Length();
84
int copy_digit_count = decimal.digit_count;
85
if(copy_digit_count >= length)
86
os << "0.";
87
os << result;
88
return os;
89
}
90
};
91![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
92
void ConvertStringToBigInteger(string input, BigInteger & a, BigInteger & b)
93![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
94
BigInteger EIGHT(8);
95
int dot_position = input.find_first_of('.');
96
int length = input.length();
97
int e_num = length - dot_position - 1;
98
b = EIGHT.Pow(e_num);
99
for(int i = dot_position + 1; i < length; ++i)
100![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
101
if(i == 0)
102
a = EIGHT * BigInteger((int)(input.at(i) - '0'));
103
else
104
a = a + BigInteger((int)(input.at(i) - '0')) * EIGHT.Pow(length - i - 1);
105
}
106
}
107![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
108
int _tmain(int argc, _TCHAR* argv[])
109![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
110
string input;
111
while(cin >> input)
112![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
113
BigInteger a, b;
114
ConvertStringToBigInteger(input, a, b);
115
BigDecimal bd = BigDecimal(a, b);
116
cout << input << " [8] = " << bd << " [10]" << endl;
117
}
118
return 0;
119
}
120![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
121![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
posted on 2009-03-31 21:21
肖羽思 阅读(498)
评论(0) 编辑 收藏 引用 所属分类:
ZOJ