高精度-10106 product

题目大意:给出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;
 } 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值