是数据类型的问题吗?

P1009 [NOIP1998 普及组] 阶乘之和

LaserDisc8 @ 2022-05-25 10:00:04

第一段,用的unsignedlonglong,然后运行后结果不对。

#include"iostream"
using namespace std;
unsigned long long f(int x){
    if(x==0||x==1)return 1;
    unsigned long long c=1;
    for(int i=1;i<=x;i++)
    c*=i;
    return c;
}
int main(){
    int a;
    unsigned long long sum=0;
    cin>>a;
    for(int m=1;m<=a;m++){
        sum+=f(m);
    }
    cout<<sum;
    return 0;
}

然后换了个大的,发现错误点又加了。但是自己运行对。是不是时间超了?

#include"iostream"
using namespace std;
long double f(int x){
    if(x==0||x==1)return 1;
    long double c=1;
    for(int i=1;i<=x;i++)
    c*=i;
    return c;
}
int main(){
    int a;
    long double sum=0;
    cin>>a;
    for(int m=1;m<=a;m++){
        sum+=f(m);
    }
    cout<<sum;
    return 0;
}

by _Virgo_ @ 2022-05-25 10:06:36

@LaserDisc8 要用高精!!!


by _Virgo_ @ 2022-05-25 10:07:54

50!>=1e63吧


by _Virgo_ @ 2022-05-25 10:09:10

(50!)=31035053229546199656252032972759319953190362094566672920420940313


by LaserDisc8 @ 2022-05-25 11:13:02

@ly_潘烨 高精的话数组开太大会炸吧?


by _Virgo_ @ 2022-05-25 12:12:02

@LaserDisc8

会,但在此题不会。

这到题高精数组开个100差不多。(int类型)

因为50!+……+1!=31035053229546199656252032972759319953190362094566672920420940313

之前看错了,不是50!。

不过,49!仅仅是50!的零头,影响不大。


|