一个程序拿出来show show,求n的阶乘保留小数点后16位,在P41.7G下计算100万的阶乘大概是1秒。大家给点意见
// 求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、回复次数:13Top
1 楼greenteanet(扎扎实实打基础,保持一颗平常心。)回复于 2004-12-03 01:47:04 得分 0
调试不通过Top
2 楼ywhbn(天涯)回复于 2004-12-03 01:53:06 得分 0
用 VC++ 编译,我是在VC++6.0下写的Top
3 楼yjh1982(血精灵)回复于 2004-12-03 08:08:41 得分 0
gzTop
4 楼ywhbn(天涯)回复于 2004-12-03 10:00:18 得分 0
计算的就是这几句:
for(i = 2; i <= n; i++)
{
r = r * i;
if(r >= 1.0e+300)
{
r /= 1.0e+300;
re += 300;
}
}
结果保存在 r和re 里Top
5 楼yongxinwork(永新)回复于 2004-12-03 16:17:46 得分 0
用这种方法行不通,
10万的阶层估计已经overflow了,
100万早就完蛋了,
Top
6 楼idler(告别teenage)(偶是豆子。。。)(歇业休息。。。)回复于 2004-12-03 16:26:27 得分 0
楼主这个程序素那天上的浮云。。。Top
7 楼bobedong(bobedong)回复于 2004-12-03 16:29:19 得分 0
软件测量的时间不准确,最好用硬件信号,Top
8 楼copygirl(wa!)回复于 2004-12-03 16:29:37 得分 0
好玩,带回家玩Top
9 楼idler(告别teenage)(偶是豆子。。。)(歇业休息。。。)回复于 2004-12-03 16:52:00 得分 0
实测结果精度在10位有效数字,误差还是大了一点。楼主的方法其实是用来估计结果的数量级的。Top
10 楼lswx(柳树)回复于 2004-12-03 16:55:12 得分 0
听课中...Top
11 楼ywhbn(天涯)回复于 2004-12-07 22:37:46 得分 0
idler(Idler) 说的好,就是用来估计结果的数量级 呵呵Top
12 楼ywhbn(天涯)回复于 2004-12-07 22:38:35 得分 0
to: yongxinwork(永新),不会overflew的,你试试Top
13 楼gzconan84(柯南)回复于 2004-12-08 22:55:21 得分 0
路过,学习ing~!Top




