uva 10106 – Product

这一题是大数相乘,还是用了刘汝佳老师的方法,下面提供两个大数相乘的算法

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;
    }
}

 

版权声明:本文为royjwy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/royjwy/p/3481083.html