大数问题--超大数(10000以内)的阶乘
问题分析:很容易发现,由于N的范围很大,一般简单的阶乘算法肯定会溢出,因为当20!已经接近long long的上限了。
所以得用大数问题的解法,就是模拟运算:
下面基于上面的思想,给出此题的两种代码实现:
①事先制表:
#include<bits/stdc++.h>
using namespace std;
#define N 10005vector<int> factorial[N];void calc(int n) //计算
{int len = factorial[n-1].size();for(int i = 0;i < len;++i){factorial[n].push_back(factorial[n-1][i]*n);}int jinwei = 0; //变量jinwei用于保存下位进上去的数字,初始为0for(int i = len-1;i >= 0;--i){int temp = jinwei + factorial[n][i]; //变量temp用于保存该位上加上进位的数字后的结果jinwei = temp/10; //此时jinwei更新为temp值十位上的数字 factorial[n][i] = temp%10; //此时该位上的数字应为temp值个位上的数字 } while(jinwei){ //将factorial[n]最前面的那位上进的数字插入到向量前面,由于jinwei可能大于9(即是一个二位数),故要用一个while循环,而不能简单地把jinzhi插到前面 factorial[n].insert(factorial[n].begin(),jinwei%10);jinwei /= 10;}
}void make_table() //制表
{factorial[1].push_back(1); //设定初始值 for(int i = 2;i < 1000;++i){calc(i);}
} int main()
{make_table();int n;while(cin >> n){int len = factorial[n].size(); //输出存储n!的向量factorial[n]for(int i = 0;i < len;++i)cout << factorial[n][i];cout << endl; }return 0;
}
②直接计算,没有制表
#include<bits/stdc++.h>
using namespace std;vector<int> v;
int n;int main()
{int n;while(cin >> n){if(n == 1) cout << '1' << endl; //n为1时,直接打印结果 else{v.push_back(1); //先向向量中插入一个数字 for(int i = 2;i <= n;++i){ //逐步操作到n int len = v.size();for(int j = 0;j < len;++j){ //将向量里每一个元素都乘上i v[j] *= i;}int jinwei = 0; //变量jinwei用于保存该位要向上进位的数字 for(int j = len-1;j >= 0;--j){int temp = jinwei + v[j]; //变量temp用于保存该位上加上进上来的数字后的结果 jinwei = temp/10; //更新变量jinwei v[j] = temp%10; //确定该位上的数字 } while(jinwei){ //对最前面一位进上去的数字进行处理,由于这个数字可能不止一位,所以不能简简单单地插到最前面,而是要用一个while循环一步步插到最前面 v.insert(v.begin(),jinwei%10);jinwei /= 10; }}int len = v.size(); //打印结果 for(int i = 0;i < len;++i){cout << v[i];}cout << endl;}v.clear();} return 0;
}
PS:一开始,为了节省时间,我采用了第一种代码,制了表,可是提交上去发现,超出内存限制,仔细一想也对,毕竟当n为3000时,结果就已经在屏幕上显示过百行了,放在内存里,肯定会花费很多内存的。
然后就才采用了第二种代码,结果过了,其实因为题目测试样例的n不会测很多的,所以完全没必要采用制表方法来节省时间,若是要测很多n,那么制表肯定会比第二种代码节省很多时间的。
大数问题--超大数(10000以内)的阶乘相关推荐
- 信息学奥赛一本通(1172:求10000以内n的阶乘)
1172:求10000以内n的阶乘 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 22142 通过数: 5506 [题目描述] 求10000以内n的阶乘. ...
- C++实现 找出10000以内的完数
C++实现 找出10000以内的完数 #include <stdio.h> int main(){int n; // 用户输入的整数int i; // 循环标志printf("输 ...
- openjudge 14:求10000以内n的阶乘
14:求10000以内n的阶乘 总时间限制: 5000ms 内存限制: 655360kB 描述 求10000以内n的阶乘. 输入 只有一行输入,整数n(0<=n<=10000). 输出 一 ...
- 信息学奥赛一本通 1172:求10000以内n的阶乘 | OpenJudge NOI 1.6 14:求10000以内n的阶乘
[题目链接] ybt 1172:求10000以内n的阶乘 OpenJudge NOI 1.6 14:求10000以内n的阶乘 [题目考点] 1. 高精度 考察:高精乘低精 高精度计算讲解 [解题思路] ...
- 求10000以内n的阶乘(信息学奥赛一本通-T1172)
[题目描述] 求10000以内n的阶乘. [输入] 只有一行输入,整数n(0≤n≤10000). [输出] 一行,即n!的值. [输入样例] 4 [输出样例] 24 [源程序] #include< ...
- 在10000以内判断一个整数,它加上100和加上268后都是一个完全平方数 3 提问:请问该数是多少?...
1 ''' 2 在10000以内判断一个整数,它加上100和加上268后都是一个完全平方数 3 提问:请问该数是多少? 4 ''' 5 import math 6 for i in range(100 ...
- 找出10000以内的自然数中的所有完数,并统计找到的完数个数。所谓完数个数,指它恰好等于除它本身之外的因子之和
#include <stdio.h> int main() {int i, j, count = 0, sum;for (i = 1; i <= 10000; i++) //穷举10 ...
- 一个数如果恰好等于它的因子(因子:即能够整除的数)之和,这个数就称为“完数”。 例如 6=1+2+3 28=1+2+4+7+14 编程找出10000以内的所有完数。
python解决:一个数如果恰好等于它的因子(因子:即能够整除的数)之和,这个数就称为"完数". 例如 6=1+2+3 28=1+2+4+7+14 编程找出10000以内的所有完数 ...
- 求10000以内的完数
一.代码 //问题:输出10000以内的完数//完数:如果一个数恰好等于除它本身外的因子之和,这个数就是完数.//例如:6=1+2+3 #include <stdio.h> #includ ...
- 计算10000以内的平方数
''' 实例三:平方数的操作练习 简述:一个整数,它加上100和加上268后都是一个完全平方数 提问:请问该数是多少? Python解题思路分析:在10000以内判断,将该数加上100后再开方,加上2 ...
最新文章
- like模糊查询是否走索引
- int(1) 和 int(10) 有什么区别?资深开发竟然分不清!
- PAT甲级1052 Linked List Sorting:[C++题解]链表排序
- 企业实战_02_MyCat基本元素
- 智能玩具 数据采集 首页展示 注册 登录 自动登录 二维码图片
- 如何安装Stata 15及网状Meta包 最新图文教程一看就会
- 2022道路运输企业安全生产管理人员操作证考试题及在线模拟考试
- 微信公总测试号的申请+微信网页授权
- jsp统计页面访问量和刷访问量的简单使用
- SPSS中的比较均值—均值分析过程
- c#尝试写入或者读取受保护的内存_C# 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 | 学步园...
- (转)日本語を輸入について
- 回顾Win10自带表情包快捷键
- 清除本地dns(Mac,win)
- uva 10859 放置街灯树形dp
- 安卓 实现网易云音乐底部播放栏效果之使用UI绑定到Service上实现
- IDEA 设置代码提示或自动补全的快捷键
- xftp无法连接到虚拟机
- Windows下设置redis数据库允许远程访问
- 搭载鸿蒙系统的华为电脑,华为MatePad Pro配置曝光,搭载骁龙870芯片,还有鸿蒙系统加持...
热门文章
- 一个生产网络问题Broken Pipe引发的思考
- QT创建项目 编译提示 无法运行“rc.exe”
- RestTemplate get请求报错:Not enough variables available to expand
- 对php课程的建议和意见,对教学的意见和建议
- 互联网大厂也乘帆出海,出海不再是新鲜事
- 运营商SDWAN组网对比之---思科Cisco-SDWAN高珊珊的博客
- 官方主板 Jeston TX1 TX2 ubuntu 18.04 迁移系统至固态SSD
- IT圈的西进运动要过期了
- springboot 幼儿园健康管理系统-毕业设计(源码加数据库文件)
- POJ3295 Tautology