首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 阶乘之计算从入门到精通-菜鸟篇
【标  题】:阶乘之计算从入门到精通-菜鸟篇
【关键字】:
【来  源】:http://blog.csdn.net/liangbch/archive/2007/04/12/1562005.aspx

阶乘之计算从入门到精通-菜鸟篇

 
摘要:本文给出一些最简单的计算阶乘的程序,这也是许多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来展开。
 
 
阶乘之计算从入门到精通-大数的表示:【上一篇】
判断GPRS是否连接的代码:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 影响ADSL线路质量的因素
  • fvwm-crystal在UTF-8环境下的中文显示问题
  • C#对XML操作:写入一笔XML记录(2)
  • MoinMoin学习记录
  • IPSwitch IMail 8.13 删除命令堆溢出利用代码(2)
  • devlog-2006-04-12: can not find channel_pvt.h.
  • Runtime.getRuntime().addShutdownHook()的使用
  • 批判 Office 2007
  • gcc与make
  • 走进嵌入式Linux的世界
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.