90pts求助
查看原帖
90pts求助
996255
ikun_god楼主2024/1/27 11:37

#10 WA了

#include <bits/stdc++.h>
using namespace std;
const int MAX_LEN = 11000;
struct BigInt
{
    int v[MAX_LEN];
    int len;
    int sign;
    BigInt(int n) {
        memset(v,0,sizeof(v));
        if (n>=0){
            sign=1;
        }
        else{
            sign=-1;
        }
        int i=0;
        while (true){
            v[i++]=n%10;
            n/=10;
            if (n==0){
                break;
            }
        }
        len=i;
    }
    BigInt(const char* a) {
        len=strlen(a);
        if (a[0]=='-'){
            sign=-1;
            len-=1;
            for (int i=0;i<=len;++i){
                if (a[len-i]!='-'){
                    v[i]=a[len-i]-'0';
                }
            }
        }
        else{
            sign=1;
            for (int i=0;i<len;++i){
                v[len-i-1]=a[i]-'0';
            }
        } 
        
    }
    int compare(const BigInt& b) {
        if (len<b.len){
            return -1;
        }
        if (len>b.len){
            return 1;
        }
        for (int i=len-1;i>=0;--i){
            if (v[i]<b.v[i]){
                return -1;
            }
            if (v[i]>b.v[i]){
                return 1;
            }
        }
        return 0;
    }
    void add(const BigInt& b) {
        int i=0,x=0;
        int blen=b.len;
        while ((i<len) || (i<blen)){
            v[i]=v[i]+b.v[i]+x;
            x=v[i]/10;
            v[i]%=10;
            ++i;
        }
        if (x > 0){
            v[i]=x;
            len = i + 1;
        } else {
            len = i;
        }
    }
    void sub(const BigInt& b) {
        int i=0,x=0,y[MAX_LEN];
        int blen=b.len;
        int f=compare(b);
        if (f==0){
            len=1;
            v[0]=0;
            return;
        }
        if (f>=1){
            for (i=0;i<len;++i){
                if (v[i]<b.v[i]){
                    v[i]+=10;
                    v[i+1]-=1;
                }
                v[i]-=b.v[i];
            }
            for (int i=len-1;i>=0;--i){
                if (v[i]==0){
                    len-=1;
                }
                else{
                    break;
                }
            }
        }
        else{
            for (i=0;i<len;++i){
                if (b.v[i]<v[i]){
                    //b.v[i]+=10;
                    v[i+1]-1;
                }
                v[i]-=b.v[i];
            }
            for (int i=0;i<len;++i){
                if (v[i]==0){
                    len-=1;
                }
                
            }
        }
    }
    void mul(const BigInt& b) {
        int c[MAX_LEN];
        memset(c,0,sizeof(c));
        for (int i=0;i<len;++i){
            int x=0;
            for (int j=0;j<b.len;++j){
                c[i+j]=v[i]*b.v[j]+x+c[i+j];
                x=c[i+j]/10;
                c[i+j]=c[i+j]%10;
            }
            c[i+b.len]=x;
        }
        memcpy(v,c,sizeof(c));
        len = len + b.len;
        while(v[len-1]==0){
            len--;
        }
    }
    void mul(int b) 
    {
        int x=0;
        for (int i=0;i<len;++i){
            v[i]=v[i]*b+x;
            x=v[i]/10;
            v[i]=v[i]%10;
        }
        while (x) {
            v[len++]=x%10;
            x/=10;
        }
    }

    void div(int b,int& m) {
        int x=0;
        for (int i=len-1;i>=0;--i){
            int t=v[i];
            v[i]=(x*10+v[i])/b;
            x=(x*10+t)%b;
        }
        m = x;
        for (int i=len-1;i>=0;--i){
            if (v[i]==0){
                len-=1;
            }
            else{
                break;
            }
        }
    }
    void div(const BigInt&b) {
        int x=0;
        for (int i=len-1;i>=0;--i){
            for (int j=0;j<b.len;++j){
                int t=v[i];
                v[i]=(x*10+v[i])/b.v[j];
                x=(x*10+t)%b.v[j];
            }
        }
        
        for (int i=len-1;i>=0;--i){
            if (v[i]==0){
                len-=1;
            }
            else{
                break;
            }
        }
    }
    void cut(){
        len=500;
    }
};
std::ostream& operator<<(std::ostream& os, const BigInt& b)
{
    if (b.sign<0){
        cout<<"-";
    }
    for(int i = b.len - 1;i >= 0; --i){
        os << b.v[i];
    }
    return os;
}
BigInt qpow(int a,int b){
    //cout<<a<<" "<<b<<endl;
    if (b==0){
		BigInt aaa(1);
        return aaa;
    }else if (b%2==1){
        BigInt tmp=qpow(a,b-1);
        tmp.cut();
		tmp.mul(a);
        //cout<<tmp<<endl;
        tmp.cut();
		return tmp;
    }else if (b%2==0){
        BigInt temp=qpow(a,b/2);
        temp.cut();
        temp.mul(temp);
        //cout<<temp<<endl;
        temp.cut();
		return temp;
    }
}
int main()
{
   int p,cnt=0;
   cin>>p;
   int len=p*log10(2)+1;
   cout<<len<<endl;
   for (int i=0;i<500-len;++i){
        cnt+=1;
        cout<<0;
        if (cnt==50){
            cout<<endl;
            cnt=0;
        }
   }
   BigInt ans=qpow(2,p);
   ans.sub(1);
   for (int i=ans.len-1;i>=0;--i){
    cnt+=1;
    cout<<ans.v[i];
    if (cnt==50){
        cout<<endl;
        cnt=0;
    }
   }
}
2024/1/27 11:37
加载中...