51nod 1057
来源:互联网 发布:战舰世界腓特烈数据 编辑:程序博客网 时间:2024/06/05 10:34
大数题,本来用模拟写的, 但是很多数据都超时了。 后来想了一下,不超时也是报精度(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=%d\n",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,i,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;}
0 0
- 51nod 1057
- 51nod 1057 高精度乘法
- 51Nod
- 51Nod
- 51nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- bzoj2388(凸包+分块)
- java逻辑删除数据库所有表的包含某个外键的行
- leetcode 100
- WebView
- eclipse php documentroot 设置 与ln-s 项目目录
- 51nod 1057
- PCB常用快捷键--针对Altium designer
- 老舍《怎样读小说》
- LintCode: 房屋染色 II
- python冒泡排序
- 最近整个人很麻木,就像我的脖子.
- 如何使SVG内的animate标签属性多值变化
- 补充之前中兴校招面试的问题(软件开发岗位)
- 使用photoView完成照片查看器(本地图片)