思路:直接使用bign类型,重载相关操作就可以了。
注意:数组需要开够,不是想当然的输入数据的250位,结果最大是500位。否则会RE错
其他:运算结果是右值,右值只能被const引用指向。
Code:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#define MAXN 500
//题目里最多是250位,你没看到代码是i+j啊,所以结果最大是500啊!!!难过RE错误,还一直以为数组开够了
using namespace std;
struct bign
{
int s[MAXN],len;
bign(){ memset(s,0,sizeof(s)); len=1;}
bign operator=(const char* num)
{
len=strlen(num);
for(int i=0;i<len;++i) s[i]=num[len-1-i]-'0';
return *this;
}
bign operator*(const bign &b) const
{
bign c;
c.len=len+b.len;
for(int i=0;i<len;++i)
for(int j=0;j<b.len;++j)
c.s[i+j]+=s[i]*b.s[j];
for(int i=0;i<c.len-1;++i)
{
c.s[i+1]+=c.s[i]/10;
c.s[i]%=10;
}
//if(!c.s[c.len-1]) c.len--;//最高位可能是0
while(c.len>1&&!c.s[c.len-1]) c.len--; //注意这里的c.len和上句中的,都不要忘了c.
//这里用while而不用if的原因是,if不能处理输入如011这样的情况,虽然不知道题目会不会这样输入
//c.clean();
return c;
}
void clean()
{
while(len>1&&!s[len-1])
len--;
}
string str() const
{
string res="";
for(int i=0;i<len;++i) res=(char)(s[i]+'0')+res;
if(res=="") res="\0";
return res;
}
};
ostream& operator<<(ostream &out,const bign &x)
{
out<<x.str();
return out;
}
istream& operator>>(istream &in, bign &x)
{
string s;
in>>s;
x=s.c_str();
return in;
}
int main()
{
bign a,b;
while(cin>>a>>b)
{
//bign c=a*b;
//cout<<c<<endl;
cout<<(a*b)<<endl;//运算的结果是右值,不能传给非const引用
}
//system("pause");
return 0;
}