问题分析:很容易发现,由于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以内)的阶乘相关推荐

  1. 信息学奥赛一本通(1172:求10000以内n的阶乘)

    1172:求10000以内n的阶乘 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 22142     通过数: 5506 [题目描述] 求10000以内n的阶乘. ...

  2. C++实现 找出10000以内的完数

    C++实现 找出10000以内的完数 #include <stdio.h> int main(){int n; // 用户输入的整数int i; // 循环标志printf("输 ...

  3. openjudge 14:求10000以内n的阶乘

    14:求10000以内n的阶乘 总时间限制: 5000ms 内存限制: 655360kB 描述 求10000以内n的阶乘. 输入 只有一行输入,整数n(0<=n<=10000). 输出 一 ...

  4. 信息学奥赛一本通 1172:求10000以内n的阶乘 | OpenJudge NOI 1.6 14:求10000以内n的阶乘

    [题目链接] ybt 1172:求10000以内n的阶乘 OpenJudge NOI 1.6 14:求10000以内n的阶乘 [题目考点] 1. 高精度 考察:高精乘低精 高精度计算讲解 [解题思路] ...

  5. 求10000以内n的阶乘(信息学奥赛一本通-T1172)

    [题目描述] 求10000以内n的阶乘. [输入] 只有一行输入,整数n(0≤n≤10000). [输出] 一行,即n!的值. [输入样例] 4 [输出样例] 24 [源程序] #include< ...

  6. 在10000以内判断一个整数,它加上100和加上268后都是一个完全平方数 3 提问:请问该数是多少?...

    1 ''' 2 在10000以内判断一个整数,它加上100和加上268后都是一个完全平方数 3 提问:请问该数是多少? 4 ''' 5 import math 6 for i in range(100 ...

  7. 找出10000以内的自然数中的所有完数,并统计找到的完数个数。所谓完数个数,指它恰好等于除它本身之外的因子之和

    #include <stdio.h> int main() {int i, j, count = 0, sum;for (i = 1; i <= 10000; i++) //穷举10 ...

  8. 一个数如果恰好等于它的因子(因子:即能够整除的数)之和,这个数就称为“完数”。 例如 6=1+2+3 28=1+2+4+7+14 编程找出10000以内的所有完数。

    python解决:一个数如果恰好等于它的因子(因子:即能够整除的数)之和,这个数就称为"完数". 例如 6=1+2+3 28=1+2+4+7+14 编程找出10000以内的所有完数 ...

  9. 求10000以内的完数

    一.代码 //问题:输出10000以内的完数//完数:如果一个数恰好等于除它本身外的因子之和,这个数就是完数.//例如:6=1+2+3 #include <stdio.h> #includ ...

  10. 计算10000以内的平方数

    ''' 实例三:平方数的操作练习 简述:一个整数,它加上100和加上268后都是一个完全平方数 提问:请问该数是多少? Python解题思路分析:在10000以内判断,将该数加上100后再开方,加上2 ...

最新文章

  1. like模糊查询是否走索引
  2. int(1) 和 int(10) 有什么区别?资深开发竟然分不清!
  3. PAT甲级1052 Linked List Sorting:[C++题解]链表排序
  4. 企业实战_02_MyCat基本元素
  5. 智能玩具 数据采集 首页展示 注册 登录 自动登录 二维码图片
  6. 如何安装Stata 15及网状Meta包 最新图文教程一看就会
  7. 2022道路运输企业安全生产管理人员操作证考试题及在线模拟考试
  8. 微信公总测试号的申请+微信网页授权
  9. jsp统计页面访问量和刷访问量的简单使用
  10. SPSS中的比较均值—均值分析过程
  11. c#尝试写入或者读取受保护的内存_C# 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 | 学步园...
  12. (转)日本語を輸入について
  13. 回顾Win10自带表情包快捷键
  14. 清除本地dns(Mac,win)
  15. uva 10859 放置街灯树形dp
  16. 安卓 实现网易云音乐底部播放栏效果之使用UI绑定到Service上实现
  17. IDEA 设置代码提示或自动补全的快捷键
  18. xftp无法连接到虚拟机
  19. Windows下设置redis数据库允许远程访问
  20. 搭载鸿蒙系统的华为电脑,华为MatePad Pro配置曝光,搭载骁龙870芯片,还有鸿蒙系统加持...

热门文章

  1. 一个生产网络问题Broken Pipe引发的思考
  2. QT创建项目 编译提示 无法运行“rc.exe”
  3. RestTemplate get请求报错:Not enough variables available to expand
  4. 对php课程的建议和意见,对教学的意见和建议
  5. 互联网大厂也乘帆出海,出海不再是新鲜事
  6. 运营商SDWAN组网对比之---思科Cisco-SDWAN高珊珊的博客
  7. 官方主板 Jeston TX1 TX2 ubuntu 18.04 迁移系统至固态SSD
  8. IT圈的西进运动要过期了
  9. springboot 幼儿园健康管理系统-毕业设计(源码加数据库文件)
  10. POJ3295 Tautology