POJ 1503 大整数

Posted 树的种子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1503 大整数相关的知识,希望对你有一定的参考价值。

之前做的大整数,都是一位一位操作。

优化方案:压缩方案。

模板: + - *  操作符重载

技术分享
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
using namespace std;

struct bigint{ // only positive number;
    static const int BASE=100000000;
    static const int WIDTH=8;
    vector<int> s;
    //value
    bigint(long long num=0){ *this = num;}
    bigint operator = (long long num){
        s.clear();
        do{
            s.push_back(num%BASE);
            num/=BASE;
        }while(num>0);
        return *this;
    }
    bigint operator = (const string& str){
        s.clear() ;
        int x,len = (str.length()-1)/WIDTH + 1;
        for(int i=0;i<len;i++){
            int end = str.length() - i*WIDTH;
            int start = max(0,end - WIDTH);
            sscanf(str.substr(start,end-start).c_str(),"%d",&x);
            s.push_back(x);
        }
        return *this;
    }
    //input&output
    friend ostream& operator << (ostream &out, const bigint& x){
        out << x.s.back();
        for(int i=x.s.size()-2;i>=0;i--){
            char buf[20];
            sprintf(buf,"%08d",x.s[i]);
            for(int j=0;j<strlen(buf);j++) out << buf[j];
        }
        return out;
    }
    friend istream& operator >>(istream &in, bigint& x){
        string s;
        if(!(in>>s)) return in;
        x=s;
        return in;
    }
    //compare
    bool operator < (const bigint& b) const {
        if(s.size()!=b.s.size()) return s.size() < b.s.size();
        for(int i=s.size()-1;i>=0;i++) if(s[i]!=b.s[i]) return s[i] < b.s[i];
        return false;//equal
    }
    bool operator > (const bigint& b) const {return b < *this;}
    bool operator <= (const bigint& b) const {return !(b < *this);}
    bool operator >= (const bigint& b) const {return !(*this < b);}
    bool operator != (const bigint& b) const {return b < *this || *this < b;}
    bool operator == (const bigint& b) const {return !(b < *this) && !(*this < b);}
    //calculate
    bigint operator +(const bigint& b) const {
        bigint c;
        c.s.clear();
        for(int i=0,g=0;;i++){
            if(g==0 && i>=s.size() && i>=b.s.size()) break;
            int x=g;
            if(i<s.size()) x+=s[i];
            if(i<b.s.size()) x+=b.s[i];
            c.s.push_back(x%BASE);
            g = x/BASE;
        }
        return c;
    }
    bigint operator +=(const bigint& b){
        *this = *this + b;
        return *this;
    }
    bigint operator -(const bigint& b) const {
        bigint c;
        c.s.clear();
        for(int i=0,g=0;;i++){
            if(g==0 && i>=s.size() && i>=b.s.size()) break;
            int x=g;
            if(i<s.size()) x+=s[i];
            if(i<b.s.size()) x-=b.s[i];
            x+=BASE;
            c.s.push_back(x%BASE);
            g = x/BASE - 1;
        }
        return c;
    }
    bigint operator * (const bigint& b) const {
        bigint c;
        c.s.clear();
        bigint g=0;
        for(int i=0;;i++){
            if(g.s.size()==0 && i>=s.size()+b.s.size()-1) break;
            bigint x;
            x.s.clear() ;
            for(int j=0;j<g.s.size();j++) x.s.push_back(g.s[j]);
            if(i<s.size()+b.s.size()-1){
                for(int j = max(0 , i-(int)s.size()+1);j<=min(i,(int)b.s.size()-1);j++){
                    bigint t = (long long)b.s[j]*s[i-j];
                    x += t;
                }
            }
            c.s.push_back(x.s[0]);
            g.s.clear();
            if(x.s.size()>1) for(int j=1;j<x.s.size();j++) g.s.push_back(x.s[j]);
        }
        return c;
    }
};

int main()
{
    //freopen("in.txt","r",stdin);
    bigint a;
    bigint b = 0;
    bigint sum = 0;

    while(cin>>a) {
        if(a==0)
            break;
        sum +=a;
    }

    cout<< sum <<endl;

    return 0;
}
View Code

 

以上是关于POJ 1503 大整数的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1503 Integer Inquiry

POJ2635-The Embarrassed Cryptographer-大整数素因子

18.06.03 POJ 4126:DNA 15年程设期末05(状压DP)

POJ 1503 -- Integer Inquiry

POJ 2506 Tiling(递推+大整数加法)

poj 2389 大整数乘法