题目大意:给出x和y,计算x*y
解题过程:WA4次,因为乘数为0时,会输出000000000……;还有初始化问题,因为在做加法时,不管两个因数的长短,直接加,这就要求保证bign中未用到的s数组元素必须为0,加上因数为0的判断和每次bign赋值时初始化之后,AC
正确代码:
# include <cstdio>
# include <cstdlib>
# include <ctime>
# include <cmath>
# include <iostream>
# include <fstream>
# include <cstring>
# include <string>
# define maxn 600
//*
#define fin cin
#define fout cout
//*/
using namespace std;
/*
ifstream fin("in.txt");
ofstream fout("out.txt");
//*/
struct bign{
int len,s[maxn];
bign(){
len=1;
memset(s,0,sizeof(s));
}
bign operator = (const char* num) {
memset(s,0,sizeof(s));//每次赋值前初始化
len=0;
int i,length=strlen(num);
for(i=0;i<length;i++){
if(num[i]!='0') break;
}
for(int j=length-1;j>=i;j--){
s[len++]=num[j]-'0';
}
if(i==length) {
memset(s,0,sizeof(s));
len=1;
}
return * this;
}
bign operator =(int num) {
char s[maxn];
sprintf(s,"%d",num);
* this=s;
return *this;
}
bign(const char * num){
memset(s,0,sizeof(s));
* this=num;
}
bign(int num){
memset(s,0,sizeof(s));
* this=num;
}
bign operator + (const bign& b) const{
bign c;
c.len=0;
for(int i=0,g=0;g||i<max(len,b.len);i++){
int x=g+s[i]+b.s[i];//需要保证s和b.s未用到的数字均为0
c.s[c.len++]=x%10;
g=x/10;
}
return c;
}
bign operator * (const bign& b) const{
bign * mid=new bign[len];
bign result=0;
for(int i=0;i<len;i++){
mid[i].len=i;
for(int j=0,g=0;g||j<b.len;j++){
int x=g+s[i]*b.s[j];
mid[i].s[mid[i].len++]=x%10;
g=x/10;
}
result=result+mid[i];
}
return result;
}
string str() {
string res="";
for(int i=0;i<len;i++){
res=(char)(s[i]+'0')+res;
}
if(res=="") res="0";
return res;
}
};
istream& operator >> (istream& in,bign& x) {
char s[maxn];
in>>s;
x=s;
return in;
}
ostream& operator << (ostream& out,bign& x){
out<<x.str();
return out;
}
int main()
{
bign x,y;
bign result;
while(fin>>x>>y){
if(x.str()=="0"||y.str()=="0") result=0;
else
result=x*y;
fout<<result;
fout<<endl;
}
return 0;
}