51nod 1057
发布时间:2021-01-17 09:46:55 所属栏目:大数据 来源:网络整理
导读:大数题,本来用模拟写的, 但是很多数据都超时了。 后来想了一下,不超时也是报精度(10000的阶乘的开多大的数组,要是每个数组只开一位的话= =) 。我先把模拟的代码贴上: #include iostream #include algorithm #include string.h #include stdlib.h #inc
大数题,本来用模拟写的, 但是很多数据都超时了。 后来想了一下,不超时也是报精度(10000的阶乘的开多大的数组,要是每个数组只开一位的话= =) 。我先把模拟的代码贴上: #include <iostream> #include <algorithm> #include <string.h> #include <stdlib.h> #include <stdio.h> using namespace std; const int N = 3000000; int arr[N]; int main() { int n,i,j; while(~scanf("%d",&n)) { arr[0] = 1; for(i=2; i<=n; i++) { int c = 0; for(j=0; j<=N; j++) { int s = arr[j]*i + c; arr[j] = s%10; c = s/10; } } for(i=N; i>=0; i--) if(arr[i] != 0) break; // printf("i=%dn",i); for(; i>=0; i--) printf("%d",arr[i]); cout<<endl; } return 0; return 0; } 后来找到一个很好的解决方案, 我们可以让一个数组的每一位都存4-7位数字,这样就会节省大量的空间。 这是代码。 #include <iostream> #include <algorithm> #include <string.h> #include <stdlib.h> #include <stdio.h> using namespace std; const int N = 100000; int arr[N]; int main() { int n,j,m; while(~scanf("%d",&n)) { arr[0] = 1; m = 0; for(i=2; i<=n; i++) { int c = 0; for(j=0; j<=m; j++) { arr[j] = i*arr[j] + c; c = arr[j] / 100000;/上个代码是%10 , 这里是%100000而已,道理是一样的。 arr[j] = arr[j]%100000; //printf("%d ",arr[j]); } if(c > 0) arr[++m] = c; } printf("%d",arr[m]); //高位到低位输出 for(i=m-1; i>=0; i--) printf("%05d",arr[i]); cout<<endl; } return 0; } (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |