uva 10106
这一题是大数相乘,还是用了刘汝佳老师的方法,下面提供两个大数相乘的算法
bign operator *(const bign& b){ 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;i++){ c.s[i+1]+=c.s[i]/10; c.s[i]%=10; } c.clean(); return c; }
}
这个方法真是太经典了,只有学习才能不断前进!
下面给出accept的代码,做题时请注意由于x,y是0-10^250,所以你的数组至少在500以上
#include<stdio.h> #include<iostream> #include<string> using namespace std; #define MAXN 600 class bign{ public: int len,s[MAXN]; bign(){ for(int i=0;i<MAXN;i++) s[i]=0; len=1; } bign(string s){ len=s.size(); for(int i=s.size()-1,j=0;i>=0;i--,j++) this->s[j]=s[i]-\'0\'; } void clean() { while(len > 1 && !s[len-1]) len--; } bign operator *(const bign& b){ 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;i++){ c.s[i+1]+=c.s[i]/10; c.s[i]%=10; } c.clean(); return c; } }; int main(){ string l1,l2; while(getline(cin,l1)&&getline(cin,l2)){ bign s1(l1),s2(l2); bign c=s1*s2; for(int i=c.len-1;i>=0;i--){ cout<<c.s[i]; } cout<<endl; } }