阶乘之计算从入门到精通-菜鸟篇
来源:互联网 发布:linux命名规范 编辑:程序博客网 时间:2024/04/29 14:37
摘要:本文给出一些最简单的计算阶乘的程序,这也是许多C语方言初学者写出的算阶乘的程序。它虽然不能正确地计算出大数阶乘,但它依然有许多正确的思想。让我们从错误中开始,开始一个漫长的,充满乐趣的探索大数阶乘计算之路吧…
程序1,一个最直接的计算阶乘的程序
#include "stdio.h"#include "stdlib.h" int main(int argc, char* argv[]){ long i,n,p; printf("n=?"); scanf("%d",&n); p=1; for (i=1;i<=n;i++) p*=i; printf("%d!=%d/n",n,p); return 0;}
程序2,稍微复杂了一些,使用了递归,一个c++初学者写的程序
#include <iostream.h> long int fac(int n); void main() { int n; cout<<"input a positive integer:"; cin>>n; long fa=fac(n); cout<<n<<"! ="<<fa<<endl; } long int fac(int n) { long int p; if(n==0) p=1; else p=n*fac(n-1); return p; }
程序点评,这两个程序在计算12以内的数是正确,但当n>12,程序的计算结果就完全错误了,单从算法上讲,程序并没有错,可是这个程序到底错在什么地方呢?看来程序作者并没有意识到,一个long型整数能够表示的范围是很有限的。当n>=13时,计算结果溢出,在C语言,整数相乘时发生溢出时不会产生任何异常,也不会给出任何警告。既然整数的范围有限,那么能否用范围更大的数据类型来做运算呢?这个主意是不错,那么到底选择那种数据类型呢?有人想到了double类型,将程序1中long型换成double类型,结果如下:
#include "stdio.h"#include "stdlib.h" int main(int argc, char* argv[]){ double i,n,p; printf("n=?"); scanf("%lf",&n); p=1.0; for (i=1;i<=n;i++) p*=i; printf("%lf!=%.16g/n",n,p); return 0;}
运行这个程序,将运算结果并和windows计算器对比后发现,当于在170以内时,结果在误差范围内是正确。但当N>=171,结果就不能正确显示了。这是为什么呢?和程序1类似,数据发生了溢出,即运算结果超出的数据类型能够表示的范围。看来C语言提供的数据类型不能满足计算大数阶乘的需要,为此只有两个办法。1.找一个能表示和处理大数的运算的类库。2.自己实现大数的存储和运算问题。方法1不在本文的讨论的范围内。本系列的后续文章将围绕方法2来展开。
- 阶乘之计算从入门到精通-菜鸟篇
- 阶乘之计算从入门到精通-入门篇之一
- 阶乘之计算从入门到精通--汇编版
- 阶乘之计算从入门到精通-近似计算之二
- 阶乘之计算从入门到精通―入门篇之二
- 阶乘之计算从入门到精通―入门篇之三汇编的威力
- 阶乘之计算从入门到精通-近似计算之一
- 阶乘之计算从入门到精通-大数的表示
- 阶乘之计算从入门到精通-程序运行时间的测量
- 阶乘之计算从入门到精通-大数的表示
- Excel数组公式从入门到精通之精通篇
- Excel数组公式从入门到精通之精通篇
- 系列文章-大数阶算之计算从入门到精通(序)
- Excel数组公式从入门到精通之入门篇
- Excel数组公式从入门到精通之入门篇
- Nwjs从入门到精通 菜鸟实践笔记【1】
- 基金投资从入门到精通]之“投资技巧篇
- Java从入门到精通之工具篇(转)
- Sybase日期函数
- 用PowerShell下载网页
- VC调试入门
- 25岁的才能看懂
- 转载]CString、TCHAR*、char*转换
- 阶乘之计算从入门到精通-菜鸟篇
- 对于任意的XML的遍历
- 股票
- A brief intorduction of COM&COM+
- suse 10.0 快捷键大全
- Linux启动过程全接触
- 阶乘之计算从入门到精通-大数的表示
- 用户界面检查表
- 我看“谷歌拼音输入法之涉嫌词库门”