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




