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 请自行计算
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
一个三位数和一个三位数相乘最差情况下是六位数。
所以
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位就可以