| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 507 人关注过本帖
标题:效率问题
只看楼主 加入收藏
fresher
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2006-5-24
收藏
 问题点数:0 回复次数:6 
效率问题
#define MAX 3000
int a[MAX];
int b[MAX];
void jiafa(int k)
{
int i,j,m,carry,count=0,r=0;
for(m=0;m<MAX;m++)
b[m]=a[m];
for(i=1;i<k;i++)
{
carry=0;
for(j=0;j<MAX;j++)
{
r=a[j]+b[j]+carry;
a[j]=r%10;
carry=r/10;
}
if(carry)
count++;
}
}
void intal( )
{
int i;
for(i=0;i<MAX;i++)
a[i]=0;
}
main()
{
int i, n;
intal();
scanf("%d",&n);
a[0]=1;
for(i=1;i<=n;i++)
{
jiafa(i);
}
for(i=MAX-1;i>=0;i--)
{
printf("%d",a[i]);
}
getch();
}

程序为求大数阶乘,如何提高运行速度!!

[此贴子已经被作者于2006-6-5 17:35:32编辑过]

2006-06-05 17:35
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
不要用10进制,要用“万进制”。
因为一个short int可存放-32768~+32767之间的整数。

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-05 17:43
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

#include <stdio.h>
void cal_fal(short result[],int n,int num)
{
int i=1,j,k;
while(i<=num)
{
if(i==1)
result[0]=1;
for(k=0;k<n;k++)
result[k]*=i;
i++;
for(j=0;j<n;j++)
if(result[j]>=10)
{
result[j+1]+=result[j]/10;
result[j]%=10;
}
}
}
main()
{
short result[500]={0};
int i,k;
int num;
printf("Please input a number:");
scanf("%d",&num);
cal_fal(result,500,num);
i=499;
while(result[i]==0)
i--;
for(k=i;k>=0;k--)
printf("%d",result[k]);
getch();

}


上面那个是我以前写的,好象运行起来比您快一些.
–★–版主所说有理,用万位制来做速度会更好些,
但目前这种做法倒还没见过。


对不礼貌的女生收钱......
2006-06-05 18:53
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
以下是引用–★–在2006-6-5 17:43:00的发言:
不要用10进制,要用“万进制”。
因为一个short int可存放-32768~+32767之间的整数。

//用“万进制”计算10000以内的阶乘
//速度快的主要原因在于
//10000以内的乘法退化为“1位数”ד多位数”
//而不是费力不讨好的“多位数”ד多位数”
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
short mul(short a[],short d,short x)
{ long i,y=0;
for(i=0;i<d;i++)
{ y+=a[i]*(long)x;//x:乘数
a[i]=(short)(y%10000);
y/=10000;
}
a[d]=(short)y;
return d+!!y;//返回(万进制下的)位数
}
void main()
{
long s;
short *a,i,j,n,ws=1;
printf("N=");scanf("%d",&n);
if(n<1||n>10000)return; //n太小或太大
#define Pi 3.14159265358979323846L
s=(long)((log(2*Pi*n)/2+n*(log(n)-1))/log(10)+1);//斯特林公式
a=(short*)malloc((s/4+2)*sizeof(short));*a=1;

for(i=2;i<=n;i++)
ws=mul(a,ws,i);

printf("%d!=%d",n,a[ws-1]);
for(j=ws-2;j>=0;j--)
printf("%04d",a[j]);
printf("\n");
free(a);
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-05 20:47
fresher
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2006-5-24
收藏
得分:0 
谢谢帮助
2006-06-06 08:55
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
回复:(fresher)谢谢帮助[em07]
以下是引用fresher在2006-6-6 8:55:00的发言:
谢谢帮助

别忙谢。你想过没有为什么要用“斯特林公式”?
因为我们要向系统申请恰如其分的内存空间以便
恰好存储得下阶乘计算搞出来的大量数据。


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-06 12:58
fresher
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2006-5-24
收藏
得分:0 
呵呵 正在研究中!!!!
2006-06-06 17:36
快速回复:效率问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.105609 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved