高精度-10106 product

来源:互联网 发布:mac os 10.6.8升级 编辑:程序博客网 时间:2024/05/29 09:22

题目大意:给出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未用到的数字均为0c.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
原创粉丝点击