CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

一个程序拿出来show show,求n的阶乘保留小数点后16位,在P41.7G下计算100万的阶乘大概是1秒。大家给点意见

楼主ywhbn(天涯)2004-12-03 01:54:56 在 C/C++ / C++ 语言 提问

//   在VC++6.0下写的  
  //   求n的阶乘保留小数点后16位,1.0e+300   进制  
  //   代码简单就不注释了,在P41.7G,256M内存下计算100万的阶乘大概是1秒  
   
  #include   <stdio.h>  
  #include   <math.h>  
  #include   <stdlib.h>  
  #include   <string.h>  
  #include   <time.h>  
   
  //   读浮点数的指数  
  #define   get_exp(p)   (   atoi(p   +   strlen(p)   -   3)   )  
   
  main()  
  {  
  time_t  
  stime,  
  etime;  
  unsigned   char    
  pr[50];  
  unsigned   long   int  
  n,  
  re;  
  unsigned   long   int   register    
  i;  
  double  
  r;  
   
  while(1)  
  {  
  printf("input   n   [<=1.0e+8   ,   0   --   exit]   :");  
  scanf("%ld",   &n);   //   n不是整数会死循环  
  if(!n)  
  break;  
  r   =   1.0;  
  re   =   0;  
  //   开始计算  
  time(&stime);  
  for(i   =   2;   i   <=   n;   i++)  
  {  
  r   =   r   *   i;  
  if(r   >=   1.0e+300)  
  {  
  r   /=   1.0e+300;  
  re   +=   300;  
  }  
  }  
  time(&etime);  
  sprintf(pr,   "   %d!   =   %.20e",   n,   r);  
  sprintf(pr+strlen(pr)-3,   "%ld",   get_exp(pr)+re);  
  printf("   %s   \n   ",   pr);  
  printf("   use   time:   %.4f   s\n",   difftime(etime,   stime));  
  }  
  }  
  问题点数:0、回复次数:10Top

1 楼masse(当午 http://blog.sina.com.cn/xukf)回复于 2004-12-03 02:57:31 得分 0

……汗Top

2 楼dot99(又来混CSDN来了)回复于 2004-12-03 05:20:11 得分 0

去算法版研究一下先:DTop

3 楼imRainman(雨人)回复于 2004-12-03 07:47:49 得分 0

不错,有创意。  
   
  可以用在不要求精确结果的地方~Top

4 楼mathe()回复于 2004-12-03 09:11:16 得分 0

#define   M_PI   3.141592653589793  
  double   v;  
  while(1)  
  {  
  printf("input   n   [<=1.0e+8   ,   0   --   exit]   :");  
  scanf("%ld",   &n);   //   n不是整数会死循环  
  if(!n)  
  break;  
  if(n>1000){  
        int   m=n+1;  
        int   intpart;  
        v=log(2*PI*m)/2.0+m*log(m)-m+1/(12*m)+1/(288.0*m*m)-139/(51840.0*m*m*m)-571/(2488320.0*m*m*m));  
    v/=log(10.0);  
      intpart=(int)v;v-=intpart;  
      v*=log(10.0);v=exp(v);  
      printf("%fe+%d\n",v,intpart);  
  }else{  
        v=1.0;  
          for(i=1;i<=n;i++)v*=i;  
          printf("%f\n",v);  
    }Top

5 楼mathe()回复于 2004-12-03 09:13:04 得分 0

弄错了一步,m=n就可以了,不需要m=n+1.  
  Top

6 楼ywhbn(天涯)回复于 2004-12-03 10:00:23 得分 0

计算的就是这几句:  
  for(i   =   2;   i   <=   n;   i++)  
  {  
  r   =   r   *   i;  
  if(r   >=   1.0e+300)  
  {  
  r   /=   1.0e+300;  
  re   +=   300;  
  }  
  }  
  结果保存在   r和re   里Top

7 楼mathe()回复于 2004-12-03 16:08:13 得分 0

可是你的代码太慢了:)Top

8 楼clin003(走尽天涯路)回复于 2004-12-04 21:01:05 得分 0

不客气了   ,先坐了先Top

9 楼idler(告别teenage)(偶是豆子。。。)(歇业休息。。。)回复于 2004-12-04 21:06:40 得分 0

怎么又发了。。。  
  100万的精度是10位有效数字Top

10 楼aladar(深蓝)回复于 2004-12-05 03:27:52 得分 0

看到1e300进制就吐了,你拿浮点玩来着?精度太低了吧。。。还100万呢-_-!!Top

相关问题

  • 求m和n的阶乘
  • 求教n的阶乘的算法。
  • 考研试题:N!(N的阶乘)末尾有多少个零?
  • 求阶乘!!!
  • 30的阶乘?
  • 30的阶乘?
  • 我自己编的一个用动态链表求n阶乘的程序,请各位指教
  • C#写的一个N阶乘的递归算法 运行出现异常,请大家帮忙
  • 解释 J-a-p-a-n-e-s-e
  • 阶乘问题(典型)!!

关键词

  • exp
  • 阶乘
  • e+300
  • intpart
  • etime
  • pr
  • re
  • printf
  • unsigned
  • log

得分解答快速导航

  • 帖主:ywhbn

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo