Date:2019-07-11 19:42:01
算法实现
1 /*
2 Data: 2019-05-03 15:02:26
3 Problem:
4 */
5
6 //存储
7 struct bign
8 {
9 int d[M];
10 int len;
11 bign()
12 {
13 fill(d,d+M,0);
14 len=0;
15 }
16 };
17
18 //字符串->大数
19 bign Change(char str[])
20 {
21 bign a;
22 a.len = strlen(str);
23 for(int i=0; i<a.len; i++)
24 a.d[i] = str[a.len-i-1]-'0'; //字符串逆置存储
25 return a;
26 }
27
28 //比较
29 int Compare(bign a, bign b)
30 {
31 if(a.len > b.len)
32 return 1;
33 else if(a.len < b.len)
34 return -1;
35 else
36 {
37 for(int i=a.len-1; i>=0; i--)
38 if(a.d[i] > b.d[i]) return 1;
39 else if(a.d[i] < b.d[i]) return -1;
40 return 0;
41 }
42 }
43
44 //高精度加法
45 bign Add(bign a, bign b)
46 { //其中之一为负数则采用减法,均为负数则相加再添符号
47 bign c;
48 int carry=0; //进位
49 for(int i=0; i<a.len||i<b.len; i++)
50 {
51 int temp = a.d[i]+b.d[i]+carry;
52 c.d[c.len++] = temp%10;
53 carry = temp/10;
54 }
55 if(carry != 0)
56 c.d[c.len++] = carry;
57 return c;
58 }
59
60 //A+B
61 #include<stdio.h>
62 #include<string.h>
63 const int M=1e3;
64 struct bign
65 {
66 int d[M];
67 int len;
68 bign()
69 {
70 memset(d,0,sizeof(d));
71 len=0;
72 }
73 };
74
75 //小端存储
76 bign Change(char str[])
77 {
78 bign a;
79 a.len = strlen(str);
80 for(int i=0; i<a.len; i++)
81 a.d[i] = str[a.len-i-1]-'0';
82 return a;
83 }
84
85 bign Add(bign a, bign b)
86 {
87 bign c;
88 int carry=0;
89 for(int i=0; i<a.len||i<b.len; i++)
90 {
91 int temp = a.d[i]+b.d[i]+carry;
92 c.d[c.len++] = temp%10;
93 carry = temp/10;
94 }
95 if(carry != 0)
96 c.d[len++] = carry;
97 return c;
98 }
99
100 void Print(bign a)
101 {
102 for(int i=a.len-1; i>=0; i--)
103 printf("%d", a.d[i]);
104 }
105
106 int main()
107 {
108 char str1[M], str2[M];
109 scanf("%s%s", str1,str2);
110 bign a = Change(str1);
111 bign b = Change(str2);
112 Print(add(a,b));
113 return 0;
114 }
115
116 //高精度减法
117 bign Sub(bign a, bign b)
118 { //若a<b,交换a,b,添负号
119 bign c;
120 for(int i=0; i<a.len||i<b.len; i++)
121 {
122 if(a.d[i] < b.d[i])
123 {
124 a.d[i+1]--;
125 a.d[i]+=10;
126 }
127 c.d[c.len++] = a.d[i]-b.d[i];
128 }
129 }
130
131 //高精度与低精度的乘法 bign * int
132 bign Multi(bign a, int b)
133 { //负数取绝对值再相乘,高精度乘高精度,则外面套一层bign b的循环即可
134 bign c;
135 int carry=0;
136 for(int i=0; i<a.len; i++)
137 {
138 int temp = a.d[i]*b + carry;
139 c.d[c.len++] = temp%10;
140 carry = temp/10;
141 }
142 while(carry != 0)
143 {
144 c.d[c.len++] = carry%10;
145 carry /= 10;
146 }
147 return c;
148 }
149
150 //高精度与低精度的除法
151 bign Divide(bign a, int b, int &r) //余数为r,初值=0
152 {
153 bign c;
154 c.len = a.len; //被除数与商的各位一一对应
155 for(int i=a.len-1; i>=0; i--)
156 {
157 r = r*10 + a.d[i];
158 if(r < b) c.d[i]=0; //不够除
159 else
160 {
161 c.d[i] = r/b;
162 r %= b;
163 }
164 }
165 while(c.len>1 && c.d[c.len-1]==0)
166 c.len--; //去除高位的0,若全是0,则保留一位0
167 return c;
168 }