阶乘的计算

阶乘的定义

  n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

简单的程序代码(可以算较小的阶乘)

  没有考虑变量表达范围,假设所得结果用long型表示。

  这里需要注意的是0的阶乘应该是1.

n较小的阶乘算法

#include <iostream>
using namespace std;int main(int argc, char* argv[])
{int n = 0;long result = 0;while( cin >> n){if(n > 0){result = n;while(n > 1){result *= (n-1);--n;}}else if (n == 0){result = 1;}cout << result << endl;}return 0;
}

  这个程序的主要问题就是long的选取,long型是4个字节,32位,因为是带符号的,能表示的范围最大不超过2的31次方,即不超过10的10次方。

  即long型可以表示的数肯定是十进制下的10位数之内的。

  而14的阶乘就已经是一个11位数了。

  (事实上13的阶乘就已经超过了long的表示范围,因为13的阶乘的最高位是6,而2的31次方最高位是2。)

  所以这个程序只能计算12以下的数的阶乘。

  考虑过将数据类型进一步改为long double,得到的结果是科学计数法显示的,只有有限的有效数字,精度不高,并且当n进一步增大再次超过表示范围的时候呢?所以还是需要另外的处理办法。

大数阶乘运算  

  当n大于等于20时,因为运算结果超出了long型的表示范围,所以必须采取大数字的一般处理方法:用数组表示。

  程序如下,自己写的,没有仔细研究文后的参考资料。 

大数阶乘运算

#include <iostream>
using namespace std;int main(int argc, char* argv[])
{int n = 0;int number[21] = {0};int bitCount = 0;//记录所用到的位数下标while( cin >> n){bitCount = 0;if(n > 0){//先把n用数组表示,0号元素为个位int copyOfN = n;for(int i = 0; copyOfN > 0; copyOfN/=10, ++i){number[i] = copyOfN % 10;bitCount = i;//cout << "number: " << number[i] << endl;//cout << "bitCount: "<<bitCount <<endl;
            }//然后进行阶乘运算while( --n > 0){int carry = 0;for(int i = 0; i<= bitCount; ++i){int temp = number[i] * n + carry;number[i] = temp % 10;carry = temp / 10;}while(carry > 0){//如果有多余的进位,则说明数组需要添加位数//注意,这里由于把第二个乘数当做整体处理,而不是一位一位处理,所以进位可能也不只是一位number[++ bitCount] = carry % 10;carry /= 10;}}//最后输出运算结果for(int i = bitCount; i >= 0; --i){cout << number[i];}cout << endl;}else if (n == 0){cout << 1 << endl;}else{cout << "负数没有阶乘!" << endl;}}return 0;
}

  还是需要细心一些的。

  主要检查循环变量是否更新,对于进位的理解是否正确等。

  结果用计算器验证过,并且在九度上提交通过:http://ac.jobdu.com/problem.php?pid=1067

其他参考资料

  大数运算(采用数组模拟):

http://www.cnblogs.com/dolphin0520/archive/2011/07/16/2108006.html

http://www.cnblogs.com/yuzhaoxin/archive/2011/11/19/2205221.html

http://confach.cnblogs.com/archive/2005/07/14/192703.html

http://www.cnblogs.com/lsx54321/archive/2012/07/20/2601618.html

http://www.cnblogs.com/phinecos/archive/2009/10/06/1578411.html

转载于:https://www.cnblogs.com/mengdd/archive/2013/03/15/2960684.html

算法题007 计算n的阶乘相关推荐

  1. 截止目前为止,我遇到的最难的一道算法题:计算相邻两个数的最大差值

    hello,今天给大家带来一道算法题.这道算法题,是我目前为止,见过最难的一道题.那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值. 要求时间复杂度O( ...

  2. 记一个有趣的算法题:求n的阶乘最后一位非零数字

    今天领导录题的时候问了一个题,使我陷入了迷茫.原题目是这样的:给出n,求n的阶乘的结果的最后一位非零数字,和末尾0的个位数.例如 n = 12 n=12 n=12, 则 n ! = 1 × 2 × . ...

  3. 算法题之计算哪一桶是红酒

    算法原题 莫斯科的一位酒商现有六桶酒,容量分别为30升.32升.36升.38升.40升.62升.白酒五桶,红酒一桶.他的酒都是整桶出售,上午卖出了两桶白酒,下午卖出的白酒是上午的两倍.请问:红酒是哪一 ...

  4. android 面试算法题:青蛙跳楼梯 阶乘求和 三位数中的水仙花数

    第一题:一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上x级.求该青蛙跳上一个x级的台阶总共有多少种跳法. 解题思路: 如果只有1 级台阶,那就只有一种跳法: 如果只有2 级台阶,那就有两 ...

  5. 算法题(计算一元二次方程的根)

    原题链接 题目描述 求ax^2+bx+c=0方程的根. 输入 T组输入,对于每组输入每行三个实数a.b.c. 输出 对于每一组a.b.c,如果无解就输出"This equation is u ...

  6. 基础算法题——复数计算(蓝桥杯算法训练 P1103)

    复数计算题目( P1103) 编程实现两个复数的运算.设有两个复数 和 ,则他们的运算公式为: 要求:(1)定义一个结构体类型来描述复数. (2)复数之间的加法.减法.乘法和除法分别用不用的函数来实现 ...

  7. 算法—2,记一个自己的算法题 计算数字k在0到n中的出现的次数,k可能是0~9的一个值

    3 计算数字k在0到n中的出现的次数,k可能是0~9的一个值 例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现1出现了5次 (1 ...

  8. 语言高精度算法阶乘_JavaScript中的算法(附10道面试常见算法题解决方法和思路)...

    https://juejin.im/post/6844903811505455118 Introduction 面试过程通常从最初的电话面试开始,然后是现场面试,检查编程技能和文化契合度.几乎毫无例外 ...

  9. python计算n阶乘中尾部零的个数_(Java)设计一个算法,计算出n阶乘中尾部零的个数...

    展开全部 long 类型对大数阶乘来e68a8462616964757a686964616f31333365633963说存储范围大小,强行使用会溢出,可以使用 BigDecimal. 代码如下:im ...

最新文章

  1. 教你IDEA中如何快速查看Java字节码,必须点赞收藏!!!
  2. 【Laravel-海贼王系列】第七章,Pipeline 类解析
  3. Acwing 236. 格鲁吉亚和鲍勃(博弈论妙题)
  4. chrome浏览器中解决embed标签 loop=true 背景音乐无法循环的问题。
  5. 计算机应用技术研究生开题报告,计算机应用技术专业论文开题报告.doc
  6. 启动Eclipse时发生An internal error occurred during: Initializing Java Tooling错误,详细提示如下:...
  7. centos 命令行执行多个命令_命令行如何执行jar包里面的方法
  8. pb实现简单计算器的思想_人教版初中数学七年级下册 用计算器求算数平方根、用有理数估计算数平方根的大小公开课优质课课件教案视频...
  9. jQuery+bootstrap实现美化警告/确认/提示对话框插件
  10. Java8 的一些新特性总结
  11. 用友nc 文件服务器,用友NC软件财务部分完整版操作手册(附图片).pdf
  12. 计算机程序员带什么手表,程序员只爱格子衫?这些手表程序员也喜欢!
  13. python使用金山词霸的翻译功能
  14. 手写一个springboot的starter
  15. gateway请求就是404 nacos+gateway 搭建网关gateway
  16. 软件测试-朋友圈的点赞功能怎么测?
  17. ffmpeg 实现音频aac编码
  18. gitlab快速入门
  19. 怎么开发一个完整的对外接口API
  20. Centos 7 怎么都连不上手机阿阿阿阿Android Studio 怎么都检测不到真机啊还有关于git本地提交就缺少文件啊啊啊啊

热门文章

  1. [Qt教程] 第21篇 数据库(一)Qt数据库应用简介
  2. sed是linux命令吗,Linux命令 sed
  3. Lisp尺寸标注增加前后缀_汽车雨刷器也是有尺寸的,那具体的尺寸该如何分辨呢?...
  4. python进程池调用实例方法_Python 多进程并发操作中进程池Pool的实例
  5. 专科 java转go 翱翔之路(二)基础语法:匿名组合,方法,接口,map,json,异常处理,channel管道,select用法
  6. 每天一道LeetCode-----数独盘求解
  7. Pixhawk飞控源码目录结构及编译流程分析
  8. ARM微处理器的体系结构
  9. linux 进程可以把自己,如何将Linux进程小隐于用户?仅仅一行代码即可
  10. mysql 取 浮点运算_mysql 浮点型运算误差原因分析及解决方法