建议看目录。
重载法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 100000 + 10;
struct Big{
int a[MAXN];
int len;
void print()
{
bool h = 1;
int t = this->len;
while(!this->a[t])
t --;
for(int i = t; i >= 1; i --)
{
printf("%d", this->a[i]);
h = 0;
}
if(h) printf("0");
}
};
Big operator + (Big A, Big B)
{
A.len = max(A.len, B.len)+1;
for(int i = 1; i <= A.len; i ++)
{
A.a[i] += B.a[i];
A.a[i+1] += A.a[i]/10;
A.a[i] %= 10;
}
return A;
}
bool cmp(Big A, Big B)
{
if(A.len < B.len)
return 0;
if(A.len > B.len)
return 1;
for(int i = 1; i <= A.len; i ++)
if(A.a[i] < B.a[i])
return 0;
return 1;
}
Big t;
Big operator - (Big A, Big B)
{
if(!cmp(A,B))
{
t = A;
A = B;
B = t;
putchar('-');
}
for(int i = 1; i <= A.len; i ++)
{
A.a[i] -= B.a[i];
if(A.a[i] < 0)
{
A.a[i] += 10;
A.a[i+1]--;
}
}
return A;
}
Big operator * (Big A, Big B)
{
Big C;
C.len = A.len + B.len;
for(int i = 1; i <= A.len; i ++)
for(int j = 1; j <= B.len; j ++)
{
C.a[i+j-1] += A.a[i]*B.a[j];
C.a[i+j] += C.a[i+j-1]/10;
C.a[i+j-1] %= 10;
}
return C;
}
char s[MAXN];
void read(Big &A)
{
scanf("%s", s);
A.len = strlen(s);
for(int i = 0; i < A.len; i ++)
A.a[A.len-i] = s[i] - '0';
}
Big A, B, C;
int main()
{
read(A);read(B);
C = A + B;
// C = A - B;
// C = A * B;
C.print();
return 0;
}
重载法滋辞啊~~~
普通函数法:
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 50000;
char ac[MAXN], bc[MAXN];
int a[MAXN], b[MAXN], c[MAXN];
int al, bl, cl;
void jia()
{
for(int i = 0; i < cl; i ++)
{
c[i] += (a[i] + b[i]);
if(c[i] >= 10)
{
c[i] %= 10;
c[i+1] ++;
}
}
while(!c[cl])
cl --;
for(int i = cl; i >= 0; i --)
cout << c[i];
cout << endl;
}
void jian()
{
for(int i = 0; i < cl; i ++)
{
c[i] += (a[i] - b[i]);
if(c[i] < 0)
{
c[i] += 10;
c[i+1] --;
}
}
while(!c[cl])
cl --;
for(int i = cl; i >= 0; i --)
cout << c[i];
cout << endl;
}
void cheng()
{
for(int i = 0; i < al; i ++)
{
for(int j = 0; j <= bl; j ++)
{
c[i+j] += a[i] * b[j];
if(c[i+j] >= 10)
{
c[i+j+1] += (c[i+j]/10);
c[i+j] %= 10;
}
}
}
while(!c[cl])
cl --;
for(int i = cl; i >= 0; i --)
cout << c[i];
cout << endl;
}
int main()
{
scanf("%s %s",ac,bc);
al = strlen(ac);
bl = strlen(bc);
cl = al+bl;
for(int i = al-1; i >= 0; i --)
a[al-i-1] = (int)(ac[i] - '0');
for(int i = bl-1; i >= 0; i --)
b[bl-i-1] = (int)(bc[i] - '0');
// jia();
// jian();
cheng();
return 0;
}
分开的话:
加法:
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 100010;
char ac[MAXN], bc[MAXN];
int a[MAXN], b[MAXN], c[MAXN];
int main()
{
scanf("%s %s", ac, bc);
int al = strlen(ac), bl = strlen(bc), cl = max(al,bl);
for(int i = 0; i < al; i ++)
a[al-i-1] = (int)(ac[i] - '0');
for(int i = 0; i < bl; i ++)
b[bl-i-1] = (int)(bc[i] - '0');
for(int i = 0; i < cl; i ++)
{
c[i] += (a[i] + b[i]);
if(c[i] >= 10)
{
c[i+1] ++;
c[i] %= 10;
}
}
while(!c[cl])
cl --;
for(int i = cl; i >= 0; i --)
printf("%d",c[i]);
puts("");
return 0;
}
减法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 100010;
char ac[MAXN], bc[MAXN], t[MAXN];
int a[MAXN], b[MAXN], c[MAXN];
int main()
{
scanf("%s %s", ac, bc);
int al = strlen(ac), bl = strlen(bc), cl = max(al,bl);
if((al < bl) || ((al == bl) && strcmp(ac,bc) < 0))
{
cout << "-";
strcpy(t,ac);
strcpy(ac,bc);
strcpy(bc,t);
swap(al,bl);
}
for(int i = 0; i < al; i ++)
a[al-i-1] = (int)(ac[i] - '0');
for(int i = 0; i < bl; i ++)
b[bl-i-1] = (int)(bc[i] - '0');
for(int i = 0; i < cl; i ++)
{
c[i] += (a[i] - b[i]);
if(c[i] < 0)
{
c[i+1] --;
c[i] += 10;
}
}
while(!c[cl])
cl --;
for(int i = cl; i >= 0; i --)
printf("%d", c[i]);
puts("");
return 0;
}
乘法:
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 100010;
char ac[MAXN], bc[MAXN];
int a[MAXN], b[MAXN], c[MAXN << 1];
int main()
{
scanf("%s %s", ac, bc);
int al = strlen(ac), bl = strlen(bc), cl = al + bl;
for(int i = 0; i < al; i ++)
a[al-i-1] = (int)(ac[i] - '0');
for(int i = 0; i < bl; i ++)
b[bl-i-1] = (int)(bc[i] - '0');
for(int i = 0; i < al; i ++)
{
for(int j = 0; j < bl; j ++)
{
c[i+j] += (a[i] * b[j]);
if(c[i+j] >= 10)
{
c[i+j+1] += (c[i+j]/10);
c[i+j] %= 10;
}
}
}
while(!c[cl])
cl --;
for(int i = cl; i >= 0; i --)
printf("%d", c[i]);
puts("");
return 0;
}
托某次考试的福,写了实数。
实数相加
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1000;
char s[MAXN];
int p1[MAXN], p2[MAXN], Q1[MAXN], Q2[MAXN];
int main()
{
scanf("%s", s+1);
int len = strlen(s+1);
int x;
for(int i = 1; i <= len; i ++)
if(s[i] == '.')
x = i;
int zhshlen1 = x-1;
for(int i = 1; i < x; i ++)
p1[zhshlen1-i+1] = s[i]-'0';
int xshlen1 = len-x;
for(int i = x+1; i <= len; i ++)
Q1[i-x] = s[i]-'0';
scanf("%s", s+1);
len = strlen(s+1);
for(int i = 1; i <= len; i ++)
if(s[i] == '.')
x = i;
int zhshlen2 = x-1;
for(int i = 1; i < x; i ++)
p2[zhshlen2-i+1] = s[i]-'0';
int xshlen2 = len-x;
for(int i = x+1; i <= len; i ++)
Q2[i-x] = s[i]-'0';
/*
for(int i = zhshlen1; i >= 1; i --)
cout << p1[i];
cout << '.';
for(int i = 1; i <= xshlen1; i ++)
cout << Q1[i];
cout << endl;*/
int xsh = max(xshlen1, xshlen2);
int zh = max(zhshlen1, zhshlen2);
for(int i = xsh; i >= 1; i --)
{
Q1[i] += Q2[i];
Q1[i-1] += Q1[i]/10;
Q1[i] %= 10;
}
if(Q1[0] != 0)
{
Q1[0] = 0;
p1[1] ++;
}
for(int i = 1; i <= zh; i ++)
{
p1[i] += p2[i];
p1[i+1] += p1[i]/10;
p1[i] %= 10;
}
int t = zh+1;
while(!p1[t])
t --;
bool h = 1;
for(int i = t; i >= 1; i --)
{
h = 0;
cout << p1[i];
}
if(h) cout << '0';
h = 1;
for(int i = 1; i <= xsh; i ++)
if(Q1[i])
h = 0;
if(h) return 0;
t = xsh;
while(!Q1[t])
t --;
cout << '.';
for(int i = 1; i <= t; i ++)
cout << Q1[i];
cout << endl;
return 0;
}
/*
0.001
0.009
0.1
9.9
10
999.999
999.99
1999.989
0.0
0.0
0
99.1
10.9
110
12345.6789
12345.6789
1234.2444
1234.421
3586861.44535489651
128651208653.534128651
128654795514.97948354751
5320.41046
21203.0
26523.41046
88979.98975
789.89
89769.87975
12.1
1.23
12.0
19.0
*/