博客目录
一、题目描述
给出两个不超过500位的正整数,输出相应的运算结果。
二、代码
注意:乘法时用char类型的数值可能超出上限。
使用重载运算符定义:
#include<stdio.h> //大数乘法,加法,比较大小
#include<string.h>
using namespace std;
typedef struct
{
int len; //字符串长度
char co[600];
}Big; //大数类型
Big operator+ (Big a,Big b) //a,b>=0 (要考虑结果为0,不能反回空字符串,即最后加\0时不能加在第0位)
{
int i;
int cu=0;
Big c;
c.co[0]='1';
char *x,*y;
int alen;
x=a.co;
y=b.co;
alen=a.len;
int blen=b.len;
if(a.len<b.len)
{
x=b.co;
y=a.co; //x,alen 长
alen=b.len;
blen=a.len;
}
c.len=alen;
for(i=1;i<=alen;i++)
c.co[i]=x[i-1];
c.co[alen+1]=0;
c.co[0]='0';
cu=0;
for(i=alen;i>=1;i--)
{
c.co[i]=x[i-1];
}
for(i=0;i<blen;i++)
{
c.co[alen-i]+=y[blen-i-1]+cu-'0';
cu=0;
if(c.co[alen-i]>'9')
{
c.co[alen-i]-=10;
cu=1;
}
} // 012 012
for(i=alen-blen;i>=0 && cu;i--) // 098 +002
{
c.co[i]+=cu;
cu=0;
if(c.co[i]>'9')
{
c.co[i]-=10;
cu=1;
}
}
if(i==-1)
{
c.len++;
}
else
{
for(i=0;i<alen;i++)
{
c.co[i]=c.co[i+1];
}
if(alen==0)
alen=1;
c.co[alen]=0;
}
return c;
}
Big operator*(Big a,Big b)
{
Big c;
int out[600];
int len=a.len+b.len;
int i,j; // n位数 乘以 m位数,结果小于等于 n+m 位数
for(i=0;i<len;i++)
{
out[i]='0';
}
out[len]=0;
int cu=0;
int t;
for(i=0;i<b.len;i++) //199 93
{
for(j=0;j<a.len;j++)
{
t=(b.co[b.len-1-i]-'0')*(a.co[a.len-1-j]-'0')+out[len-1-i-j]-'0';
if(t>9)
{
cu=t/10;
t%=10;
out[len-1-i-j-1]+=cu;
}
out[len-1-i-j]=t+'0';
}
}
for(i=0;i<len && out[i]=='0';i++);
c.len=len-i;
for(j=0;i<len;j++)
{
c.co[j]=out[i++];
}
c.co[j]=0;
return c;
}
int operator< (Big a,Big b) //大数比较,要考虑字符串长度,(strcmp不能判断长度)
{
if(a.len==b.len)
return strcmp(a.co,b.co)<0;
else
return a.len<b.len;
}
int main()
{
}