高精度加法,减法,乘法,通过重载运算符及自定义数据类型实现;
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=4005;
char A[N],B[N];
struct data{
int len;
int v[N];
data(){
memset(v,0,sizeof(v));
}
void print(){
for(int i=len;i;i--)
cout<<v[i];
cout<<endl;
}
};
bool operator<(data a,data b)
{
if(a.len<b.len)return true;
if(a.len>b.len)return false;
for(int i=a.len;i;i--){
if(a.v[i]<b.v[i])return true;
if(a.v[i]>b.v[i])return false;
}
return false;
}
data operator+(data a,data b)
{
data ans;
ans.len=max(a.len,b.len);
for(int i=1;i<=ans.len;i++)
ans.v[i]=a.v[i]+b.v[i];
for(int i=1;i<=ans.len;i++){
ans.v[i+1]+=ans.v[i]/10;
ans.v[i]%=10;
}
if(ans.v[ans.len+1])ans.len++;
return ans;
}
data operator-(data a,data b)//a>b!!!
{
data ans;
ans.len=a.len;
for(int i=1;i<=a.len;i++){
if(a.v[i]<b.v[i])a.v[i]+=10,a.v[i+1]--;
ans.v[i]=a.v[i]-b.v[i];
}
while(!ans.v[ans.len]&&ans.len>1)ans.len--;
return ans;
}
data operator*(data a,data b)
{
data ans;
ans.len=a.len+b.len;
for(int i=1;i<=a.len;i++)
for(int j=1;j<=b.len;j++)
ans.v[i+j-1]+=a.v[i]*b.v[j];
for(int i=1;i<=ans.len;i++){
ans.v[i+1]+=ans.v[i]/10;
ans.v[i]%=10;
}
while(!ans.v[ans.len]&&ans.len>1)ans.len--;//注意必须加上ans.len>1,否则有一个数为0时会re
return ans;
}
int main()
{
//gets(A+1);gets(B+1);
//cin.getline(A+1,sizeof(A));cin.getline(B+1,sizeof(B));
scanf("%s",A+1);scanf("%s",B+1);//几种读取方法
data a,b,c;
a.len=strlen(A+1);b.len=strlen(B+1);
for(int i=1;i<=a.len;i++)
a.v[i]=A[a.len-i+1]-'0';
for(int i=1;i<=b.len;i++)
b.v[i]=B[b.len-i+1]-'0';
// if(a<b){
// c=a;a=b;b=c;cout<<'-';//如果是减法必须把两个数交换再减
// }
// c=a-b;
c=a*b;
c.print();
return 0;
}
另一个看起来更完善的模板:
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 1000;
struct bign{
int d[maxn], len;
void clean() { while(len > 1 && !d[len-1]) len--; }
bign() { memset(d, 0, sizeof(d)); len = 1; }
bign(int num) { *this = num; }
bign(char* num) { *this = num; }
bign operator = (const char* num){
memset(d, 0, sizeof(d)); len = strlen(num);
for(int i = 0; i < len; i++) d[i] = num[len-1-i] - '0';
clean();
return *this;
}
bign operator = (int num){
char s[20]; sprintf(s, "%d", num);
*this = s;
return *this;
}
bign operator + (const bign& b){
bign c = *this; int i;
for (i = 0; i < b.len; i++){
c.d[i] += b.d[i];
if (c.d[i] > 9) c.d[i]%=10, c.d[i+1]++;
}
while (c.d[i] > 9) c.d[i++]%=10, c.d[i]++;
c.len = max(len, b.len);
if (c.d[i] && c.len <= i) c.len = i+1;
return c;
}
bign operator - (const bign& b){
bign c = *this; int i;
for (i = 0; i < b.len; i++){
c.d[i] -= b.d[i];
if (c.d[i] < 0) c.d[i]+=10, c.d[i+1]--;
}
while (c.d[i] < 0) c.d[i++]+=10, c.d[i]--;
c.clean();
return c;
}
bign operator * (const bign& b)const{
int i, j; bign c; c.len = len + b.len;
for(j = 0; j < b.len; j++) for(i = 0; i < len; i++)
c.d[i+j] += d[i] * b.d[j];
for(i = 0; i < c.len-1; i++)
c.d[i+1] += c.d[i]/10, c.d[i] %= 10;
c.clean();
return c;
}
bign operator / (const bign& b){
int i, j;
bign c = *this, a = 0;
for (i = len - 1; i >= 0; i--)
{
a = a*10 + d[i];
for (j = 0; j < 10; j++) if (a < b*(j+1)) break;
c.d[i] = j;
a = a - b*j;
}
c.clean();
return c;
}
bign operator % (const bign& b){
int i, j;
bign a = 0;
for (i = len - 1; i >= 0; i--)
{
a = a*10 + d[i];
for (j = 0; j < 10; j++) if (a < b*(j+1)) break;
a = a - b*j;
}
return a;
}
bign operator += (const bign& b){
*this = *this + b;
return *this;
}
bool operator <(const bign& b) const{
if(len != b.len) return len < b.len;
for(int i = len-1; i >= 0; i--)
if(d[i] != b.d[i]) return d[i] < b.d[i];
return false;
}
bool operator >(const bign& b) const{return b < *this;}
bool operator<=(const bign& b) const{return !(b < *this);}
bool operator>=(const bign& b) const{return !(*this < b);}
bool operator!=(const bign& b) const{return b < *this || *this < b;}
bool operator==(const bign& b) const{return !(b < *this) && !(b > *this);}
string str() const{
char s[maxn]={};
for(int i = 0; i < len; i++) s[len-1-i] = d[i]+'0';
return s;
}
};
istream& operator >> (istream& in, bign& x)
{
string s;
in >> s;
x = s.c_str();
return in;
}
ostream& operator << (ostream& out, const bign& x)
{
out << x.str();
return out;
}