P1009 50pts!!!!!

P1009 [NOIP1998 普及组] 阶乘之和

EricOO7 @ 2023-12-09 14:52:58

50分代码

#include<bits/stdc++.h>
using namespace std;
long long jc(int n)
{
    int s = 1,i;
    for(i=1;i<=n;i++){
        s *= i;
    }
    return s;
}
int main(){
    long long n,i,s = 0;
    cin>>n;
    for(i=1;i<=n;i++){
        s = jc(i) + s;
    }
    cout<<s;
    return 0;
}

哪里错了!!

求助!!!


by EricOO7 @ 2023-12-09 15:16:18

@LYBT 明白了


by EricOO7 @ 2023-12-09 15:20:26

@xiaoshumiao 代码:


#include<bits/stdc++.h>
using namespace std;
long long jc(n){
    int x;
    while(n>0){
        if(n-1==1){
            jc(n-1) = n-1;
        }
        x = n*jc(n-1);
    }
    cout<<x;
    return 0;
}
int main(){
    long long n,i,s = 0;
    cin>>n;
    for(i=1;i<=n;i++){
        s += jc(i);
    }
    cout<<s;
    return 0;
}

by LYBT @ 2023-12-09 15:22:05

我有个写好的高精度结构体,你可以用用

struct HP_int:vector<int>{//HP_int == hign precision int(高精度)
    HP_int(int n=0){
        push_back(n);
        check();
    }
    HP_int& check(){
        while(!empty()&&!back())pop_back();
        if(empty())return *this;
        for(int i=1;i<size();i++){
            (*this)[i]+=(*this)[i-1]/10;
            (*this)[i-1]%=10;
        }
        while(back()>=10){
            push_back(back()/10);
            (*this)[size()-2]%=10;
        }
        return *this;
    }
};
istream& operator>>(istream &is,HP_int &n){
    string s;
    is>>s;
    n.clear();
    for(int i=s.size()-1;i>=0;i--)n.push_back(s[i]-'0');
    return is;
}
ostream& operator<<(ostream &os,const HP_int &n){
    if(n.empty())os<<0;
    for(int i=n.size()-1;i>=0;i--)os<<n[i];
    return os;
}
HP_int operator*(const HP_int &a,const HP_int &b){
    HP_int n;
    n.assign(a.size()+b.size()-1,0);
    for(int i=0;i!=a.size();i++){
        for(int j=0;j!=b.size();j++){
            n[i+j]+=a[i]*b[j];
        }
    }
    return n.check();
}
HP_int operator+(const HP_int &a,const HP_int &b){
    HP_int n;
    int jw=0;
    n.assign(max(a.size(),b.size())+1,0);
    for(int i=0;i!=max(a.size(),b.size());i++){
        if(i<b.size()&&i<a.size()){
            n[i]+=a[i]+b[i]+jw;
            jw=n[i]/10;
            n[i]%=10;
        }
        else if(i<a.size()){
            n[i]+=a[i]+jw;
            jw=n[i]/10;
            n[i]%=10;
        }
        else{
            n[i]+=b[i]+jw;
            jw=n[i]/10;
            n[i]%=10;
        }
    }
    if(jw!=0) n[a.size()]=jw;
    return n.check();
}
bool operator<(const HP_int &a,const HP_int &b){
    if(a.size()!=b.size())return a.size()<b.size();
    for(int i=a.size()-1;i>=0;i--){
        if(a[i]!=b[i]) return a[i]<b[i];
    }
    return 0;
}
bool operator>(const HP_int &a,const HP_int &b){
    if(a.size()!=b.size())return a.size()>b.size();
    for(int i=a.size()-1;i>=0;i--){
        if(a[i]!=b[i]) return a[i]>b[i];
    }
    return 0;
}
bool operator==(const HP_int &a,const HP_int &b){
    if(a.size()!=b.size()) return 0;
    for(int i=a.size()-1;i>=0;i--){
        if(a[i]!=b[i]) return 0;
    }
    return 1;
}

由于本人比较垃圾,没完全写好,请注意使用时,i++要写成i=i+1,不要写<=,且int和HP_int不能转换,可以直接赋值


by LYBT @ 2023-12-09 15:24:06

竞赛里很少用高精度了,在以后编码时遇到高精度,可以抄模版


by EricOO7 @ 2023-12-09 15:31:08

@LYBT 这不是zhan吗?


by LYBT @ 2023-12-09 15:32:13

里面用的是vector,动态数组


by LYBT @ 2023-12-09 15:34:41

@EricOO7 你不用考虑别的,你只要把需要的东西全定义成HP_int型就行啦,然后注意我前面的提醒


by EricOO7 @ 2023-12-09 15:41:30

@LYBT 代码:


#include<bits/stdc++.h>
using namespace std;
long long jc(n){
    HP_int x;
    while(n>0){
        if(n-1==1){
            jc(n-1) = 1;
        }
        x = n*jc(n-1);
    }
    cout<<x;
    return 0;
}
int main(){
    HP_int n,i,s = 0;
    cin>>n;
    for(i=1;i<=n;i++){
        s += jc(i);
    }
    cout<<s;
    return 0;
}

by LYBT @ 2023-12-09 17:03:26

@EricOO7 所以把我那个类型声明写上去啊,这样回编译失败的


上一页 |