高精度算法-面向对象

高精度算法-面向对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include<bits/stdc++.h>
using namespace std;
class B {
private:
string s;
int num[1100],len;
public:
friend void input(B);
friend void output(B);
B() {
s="";
len=0;
memset(num,0,sizeof(num));
}
B(string a) {
s=a;
len=s.size();
for(int i=0; i<len; i++)num[i]=s[len-i-1]-'0';
}
bool operator >=(const B& a) {
if(len>a.len)return true;
if(len==a.len)for(int i=len-1; i>=0; i--) {
if(num[i]>a.num[i])return true;
else if(num[i]<a.num[i])return false;
}

return true;
}
B& operator =(const B& a) {
this->len=a.len;
this->s=a.s;
for(int i=0; i<len; i++)this->num[i]=a.num[i];
return*this;
}
B operator +(B b) {
B tmp;
tmp.len=max(len,b.len);
for(int i=0; i<max(len,b.len); i++) {
tmp.num[i]+=b.num[i]+num[i];
tmp.num[i+1]+=tmp.num[i]/10;
tmp.num[i]%=10;
}
if(tmp.num[tmp.len]>0)tmp.len++;
return tmp;
}
B operator -(B b) {
B tmp;
tmp.len=max(len,b.len);
for(int i=0; i<tmp.len; i++) {
tmp.num[i]=num[i]-b.num[i];
if(tmp.num[i]<0) {
tmp.num[i+1]--;
tmp.num[i]+=10;
}
}
while(tmp.num[tmp.len-1]==0&&tmp.len>1)tmp.len--;
return tmp;
}
B operator *(B b) {
B tmp;
tmp.len=len+b.len+1;
for(int i=0; i<len; i++) {
for(int j=0; j<b.len; j++) {
tmp.num[i+j]+=num[i]*b.num[j];
tmp.num[i+j+1]+=tmp.num[i+j]/10;
tmp.num[i+j]%=10;
}
}
while(tmp.num[tmp.len-1]==0&&tmp.len>1)tmp.len--;
return tmp;
}
B operator /(B b) {
B tmp,ans("0");
B one("0");
tmp.len=len;
for(int i=0; i<len; i++)tmp.num[i]=num[i];
int diff=len-b.len;
for(int i=tmp.len-1; i>=b.len-1; i--) {
B t;
t.len=b.len;
for(int j=i+1-b.len; j<=i; j++){
t.num[j-diff]=tmp.num[j];
}
while(t>=b) {
for(int j=i+1-b.len; j<=i; j++) {
tmp.num[j]-=b.num[j-diff];
if(tmp.num[j]<0){
tmp.num[j]+=10;
tmp.num[j+1]--;
}
t.num[j-diff]=tmp.num[j];
}
one.num[i-b.len+1]=1;
one.len=i-b.len+2;
ans=ans+one;
}
one.num[i-b.len+1]=0;
diff--;
if(i>0&&tmp.num[i]>0)tmp.num[i-1]+=tmp.num[i]*10;
}
return ans;
}
};
void input(B a) {
cin>>a.s;
a.len=a.s.size()-1;
for(int i=0; i<=a.len; i--) {
a.num[i]=a.s[a.len-i]-'0';
}
}
void output(const B a) {
for(int i=a.len-1; i>=0; i--) {
cout<<a.num[i];
}
}
int main() {
//input(a);
B a("1816324242342");
B b("233333");
B c=a/b;
output(c);
return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!