出大问题

P1591 阶乘数码

wsadjkl0 @ 2021-05-04 09:07:12

数组开了一千万才装下了1000的阶乘QWQ怎么回事啊

#include <iostream>
#include<cstring>
#include<algorithm>

using namespace std;

char a1[3000];
int a[10000000];
void doit(){
    memset(a1, 0, sizeof(a1)); 
    for(int i = 0; i < 10000000; i++) a[i] = 0;

    a[0] = 1;
    int n, m, len = 1;
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
        for(int j = 0; j < len; j++) 
            a[j] *= i;
        for(int j = 0; j < len; j++) {
            a[j+1] += a[j]/10;
            a[j] %= 10;
            if(a[j+1] != 0) len++;;
        }
    }
    while(a[len] == 0 && len > 0) len--;
    for(int i = len; i >= 0; i--) cout << a[i];
    cout << endl << len;
}
int main() {
    // your code goes here
    doit();
    return 0;
}

by wsadjkl0 @ 2021-05-04 09:10:32

没事了,把if(j+1)换成len就正常了,有大佬讲讲吗


by Textbook_blasphemy @ 2021-05-04 09:11:07

@wsadjkl0 请自行计算1000!是多大


by Masna_Kimoyo @ 2021-05-04 09:12:27

同上

您真当1000!是1000啊


by wsadjkl0 @ 2021-05-04 09:16:57

@陶(戴)佳伟 查过了,刚开始开的是3000,然后还是不行,后来发现我的长度 len 在中间居然加到了 105w ,不知道为什么


by Suzt_ilymtics @ 2021-05-04 09:59:38

@wsadjkl0

一个三位数和一个三位数相乘最差情况下是六位数。

所以 1000! 的位数就是每个数的位数的和,大约是 \frac{1000 \times 1001}{2} = 500500


by wsadjkl0 @ 2021-05-04 10:35:03

@Suzt_ilymtics 虽然很有道理,但是1000的阶乘总共才两千五百位不到( ⊙o⊙ ),因为最多是1000个三位数相乘,位数小于等于3*1000=3000。 我的len进位似乎是这么进到了一百多万位......


by Suzt_ilymtics @ 2021-05-04 13:22:50

@wsadjkl0

我上面好像胡错了

if(a[j+1] != 0) len++;;

感觉这一句不应该加载循环里面


by wsadjkl0 @ 2021-05-04 13:41:04

@Suzt_ilymtics 已经解决啦,确实是这一句的问题,j+1改成len就OK了。 j+1的话每次计算完贡献后此时存的数组中如果有几百位都大于10,len就会加几百次,但实际上只需要进1-3位就可以


|