-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBigNumber.cpp
More file actions
56 lines (52 loc) · 1.03 KB
/
BigNumber.cpp
File metadata and controls
56 lines (52 loc) · 1.03 KB
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
struct BigN{
char str[2005];
int a[2005];
void read(char *str){//数据读入
a[0]=strlen(str);
for(int i=1;i<=a[0];i++)
a[i]=str[a[0]-i]-'0';
}
void prin(){//数据输出
for(int i=a[0];i>0;i--)
printf("%d ",a[i]);
putchar(10);
}
BigN operator* (const BigN &x){//乘法,最高支持1000位乘法
BigN c;
memset(c.a,0,sizeof(c.a));
for(int i=1;i<=a[0];i++)
for(int j=1;j<=x.a[0];j++){
c.a[i+j-1]+=a[i]*x.a[j];
}
//for(int i=1;
int ca=0;
for(int i=1;i<a[0]+x.a[0];i++){
c.a[i]+=ca;
if(c.a[i]>9)ca=c.a[i]/10;
else ca=0;
c.a[i]%=10;
}
if(ca){
c.a[0]=a[0]+x.a[0];
c.a[c.a[0]]=ca;
}
else c.a[0]=a[0]+x.a[0]-1;
return c;
}
BigN operator+ (const BigN &x){//加法,最高支持2000位加法
BigN r;
int maxs=max(a[0],x.a[0]),ca=0;
for(int i=1;i<=maxs;i++){
r.a[i]=a[i]+x.a[i]+ca;
if(r.a[i]>9)ca=r.a[i]/10;
else ca=0;
r.a[i]%=10;
}
if(ca){
r.a[maxs+1]=ca;
r.a[0]=maxs+1;
}
else r.a[0]=maxs;
return r;
}
};