高精结构体30分求助
查看原帖
高精结构体30分求助
633466
LiaoYF1楼主2022/7/4 09:16

从昨天调到今天,昨天是高精比较出了问题,今天不知道是什么高精结构体有点过度压行

#include <bits/stdc++.h>
using namespace std;
struct bigint{int len=1;int num[100]={0};bigint&operator=(long long t){int i=0;while(t){num[i++]=t%10;t/=10;}len=i;return*this;}int operator[](int i)const{return num[i];}bigint&operator=(string t){len=t.length();for(int i=0;i<(int)t.length();i++){num[i]=t[len-i-1]-'0';}return*this;}void print(ostream&co=cout)const{for(int i=len-1;i>=0;i--)co<<num[i];}bool operator==(const bigint t)const{if(len!=t.len)return 0;for(int i=0;i<len;i++){if(num[i]!=t[i]){return 0;}}return 1;}bool operator<(const bigint t)const{if(len!=t.len)return len<t.len;for(int i=len-1;i>=0;i--){return num[i]<t[i];}}bool operator>(const bigint t)const{if(len!=t.len)return len>t.len;for(int i=len-1;i>=0;i--){return num[i]>t[i];}}bigint operator*(const bigint&b){int len3=len+b.len;bigint c;c.len=len3;for(int i=0;i<len;i++){for(int j=0;j<b.len;j++){c.num[i+j]+=num[i]*b[j];}}for(int i=0;i<len3;i++){c.num[i+1]+=c.num[i]/10;c.num[i]=c.num[i]%10;}while(1){if(c[len3-1]||len3==1)break;len3--;}c.len=len3;return c;}bigint operator+(const bigint&b){bigint c;int len3=max(len,b.len);int jin=0;for(int i=0;i<=len3-1;i++){c.num[i]=num[i]+b[i]+jin;if(c[i]>9){c.num[i+1]+=c.num[i]-9;c.num[i]-=10;jin=1;}else{jin=0;}}c.len=len3;return c;}bigint operator-(const bigint&b){bigint c;int len3=max(len,b.len);int jie=0;for(int i=0;i<len3;i++){c.num[i]=num[i]-b[i]-jie;if(c.num[i]<0){jie=1;c.num[i]+=10;}else{jie=0;}}while(1){if(c.num[len3-1]!=0||len3==1){break;}len3--;}c.len=len3;return c;}bigint operator+(const int&b){bigint x;x=b;return*this+x;}bigint operator-(const int&b){bigint x;x=b;return*this-x;}bigint operator*(const int&b){bigint x;x=b;return*this*x;}};ostream&operator<<(ostream&co,const bigint&t){t.print(co);return co;}

bigint f[45][45];
int s[45];
int n,k;
string s1;
bigint js(int x,int y){
    bigint sum;int t=1;
    sum=0;
    for(int i=y;i>=x;i--){

        sum=sum+s[i]*t;
        t*=10;
    }
    return sum;
}
int main(){
    cin>>n>>k>>s1;
    for(int i=0;i<s1.length();i++){
        s[i+1]=s1[i]-'0';
    }
    //cout<<s[4]<<endl;
    for(int i=1;i<=n;i++){
        f[0][i]=js(1,i);
        //cout<<endl;
    }
    for(int i=1;i<=k;i++){
        for(int j=1;j<=n;j++){
            for(int m=j;m>=i;m--){
                //(f[i-1][l-1]*js(l,j)).print();
                //cout<<js(l,j).len<<" ";
                //cout<<l<<" "<<j<<endl;
                //cout<<" ";
                //cout<<i<<" "<<j<<endl;

                f[i][j]=max(f[i][j],f[i-1][m-1]*js(m,j));
                //cout<<i<<" "<<j<<"\n";
                //cout<<f[i][j]<<" "<<f[i-1][m-1]*js(m,j);
                //cout<<"\n\n";
            }
        }
    }
    cout<<f[k][n];

    return 0;
}

实测去掉高精能得60分,没压行的在这(只有结构体)

struct bigint {
    int len = 1;
    int num[100] = {0};
    bigint &operator=(long long t) {
        int i=0;
        while(t) {
            num[i++]=t%10;
            t/=10;
        }
        len=i;
        return *this;
    }
    int operator[](int i) const {
        return num[i];
    }
    bigint &operator=(string t) {
        len = t.length();
        for (int i = 0; i < (int)t.length(); i++) {
            num[i] = t[len - i - 1] - '0';
            // cout<<1;
        }
        return *this;
    }
    void print(ostream &co=cout) const{
        for (int i = len - 1; i >= 0; i--) co << num[i];
    }
    bool operator==(const bigint t) const {
        if (len != t.len) return 0;
        for (int i = 0; i < len; i++) {
            if (num[i] != t[i]) {
                return 0;
            }
        }
        return 1;
    }
    bool operator<(const bigint t) const{
        if (len != t.len) return len < t.len;
        for (int i = len-1; i >=0; i--) {
            //cout<<num[0]<<" "<<t[0]<<"\n";
            return num[i] < t[i];
        }
    }
    bool operator>(const bigint t) const{
        if (len != t.len) return len > t.len;
        for (int i = len-1; i >=0; i--) {
            
            return num[i] > t[i];
        }
    }
    bigint operator*(const bigint &b) {
        int len3 = len + b.len;
        bigint c;
        c.len = len3;
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < b.len; j++) {
                c.num[i + j] += num[i] * b[j];
            }
        }
        // c.print();
        for (int i = 0; i < len3; i++) {
            c.num[i + 1] += c.num[i] / 10;
            c.num[i] = c.num[i] % 10;
        }
        while (1) {
            if (c[len3 - 1] || len3 == 1) break;
            len3--;
        }
        c.len = len3;
        return c;
    }
    bigint operator+(const bigint &b) {
        bigint c;
        int len3=max(len,b.len);
        int jin = 0;
        for (int i = 0; i <= len3 - 1; i++) {
            c.num[i] = num[i] + b[i] + jin;
            if (c[i] > 9) {
                c.num[i + 1] += c.num[i] - 9;
                c.num[i] -= 10;
                jin = 1;
            } else {
                jin = 0;
            }
        }
        c.len=len3;
        return c;
    }
    bigint operator-(const bigint &b) {
        bigint c;
        int len3 = max(len,b.len);
        int jie = 0;
        for (int i = 0; i < len3; i++) {
            c.num[i] = num[i]-b[i]-jie;
            if(c.num[i] < 0) {
                jie =1;
                c.num[i] += 10;
            } else {
                jie = 0 ;
            }
        }
        while(1) {
            if(c.num[len3-1]!=0||len3==1) {
                break;
            }
            len3--;
        }
        c.len=len3;
        return c;
    }
    bigint operator+(const int &b) {
        bigint x;
        x=b;
        return *this+x;
    }
    bigint operator-(const int &b) {
        bigint x;
        x=b;
        return *this-x;
    }
    bigint operator*(const int &b) {
        bigint x;
        x=b;
        return *this*x;
    }
};
ostream & operator <<(ostream &co,const bigint &t){
    t.print(co);
    return co;
}

2022/7/4 09:16
加载中...