51nod 1057
发布时间:2020-12-14 01:33:05 所属栏目:大数据 来源:网络整理
导读:大数题,本来用模拟写的, 但是很多数据都超时了。 后来想了一下,不超时也是报精度(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;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |