高精度咋写,蒟蒻求助,c++

P1009 [NOIP1998 普及组] 阶乘之和

AIMEE11 @ 2022-08-04 19:01:48

#include<iostream>
using namespace std;
int main()
{
    unsigned long long n,sum=0,a=1;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        a*=i;
        sum+=a;
    }
    cout<<sum;
}

by _cyle_King @ 2022-08-04 19:07:12

@AIMEE11 bdfs,这种问题一般不会有人主动去帮你的。


by Haber @ 2022-08-04 19:07:49

题解是什么东西啊


by Jastin @ 2022-08-04 19:08:40

int a,b=int(input()),int(input())
print(a+b)

by 111222333aaa @ 2022-08-04 19:09:12

@AIMEE11 真·高精度


by AIMEE11 @ 2022-08-04 19:10:36

@_cyle_King 才注册几天,不晓得


by _cyle_King @ 2022-08-04 19:11:45

@Jastin (我是个菜鸡,说错了勿喷)您的 python 确定没有问题吗?


by AIMEE11 @ 2022-08-04 19:12:49

@111222333aaa 我也没办法啊啊啊,怎么写啊 要不然我也不会开 unsigned long long 啊啊啊啊


by AIMEE11 @ 2022-08-04 19:15:21

算了,50分也不是不可以(bushi)


by _cyle_King @ 2022-08-04 19:16:45

@AIMEE11 您自学一下高精度吧,我试过,这题用 __128 过不去。


by fiveyes @ 2022-08-04 19:18:10

可以参考《深入浅出程序设计竞赛(基础篇)》124页的例程。书里对高精度算法讲的很清楚。

#include <iostream>
#include <string>
#include <cstring> 
#include <cstdio>
using namespace std;

#define maxn 100
struct Bigint{
    int len, a[maxn]; // 为了兼顾效率与代码复杂度,用len记录位数,a记录每个数位
    Bigint(int x = 0) { // 通过初始化使得这个大整数能够表示整型 x,默认为0 
        memset(a, 0, sizeof(a));
        for(len=1; x; len++)
            a[len] = x % 10, x /= 10;
        len--;
    }
    int &operator[](int i){
        return a[i]; // 重载[],可以直接用x[i] 代表x.a[i],编写时更加自然 
    }
    void flatten(int L){ // 一口气处理1到L范围内的进位并重置长度。需要保证L不小于有效长度
        // 因为相当于把不是一位数的位都处理成一位数,故取名为“展平”。 
        len = L;
        for(int i=1; i<=len; i++)
            a[i+1] += a[i] / 10, a[i] %= 10;
        for(;!a[len];) // 重置长度成为有效长度
            len--; 
    }
    void print(){ // 输出 
        for(int i=max(len, 1); i>=1; i--)
            printf("%d", a[i]);
    }
};

Bigint operator+(Bigint a, Bigint b){ // 表示两个Bigint类相加,返回一个Bigint类 
    Bigint c;
    int len = max(a.len, b.len);
    for(int i=1; i<=len; i++)
        c[i] += a[i] + b[i]; // 计算贡献
    c.flatten(len + 1); // 答案不超过 len+1 位,所以用 len+1 做一遍“展平”处理进位
    return c; 
}

Bigint operator*(Bigint a, int b){ // 表示 Bigint类乘整型变量,返回一个 Bigint 类 
    Bigint c;
    int len = a.len;
    for(int i=1; i<=len; i++)
        c[i] = a[i] * b; // 计算贡献
    c.flatten(len+11); // int 类型最长10位,所以可以这样做一遍“展平”处理进位
    return c; 
}

int main()
{
    Bigint ans(0), fac(1); // 分别用0和1初始化 ans 与 fac,如果要将常数赋值给大整数,可以使用类似于 ans = Bigint(233)的办法
    int m;
    cin >> m;
    for(int i=1; i<=m; i++) {
        fac = fac * i; // 模拟题意
        ans = ans + fac; 
    }
    ans.print(); // 输出答案 
    return 0;
}

| 下一页