大数据n!(n的阶乘)计算方法讨论

yuhan_0110 2007-10-16 04:41:16
如题,以下是我找到的两种方法。

#include <stdio.h>
#include <time.h>
void main()
{
int n = 10000;
int a[50000] = {0};
a[0] = 1; //用数组的一项存放计算结果的位数
a[1] = 1; //将第一项赋值为一

//计算
clock_t time_begin = clock();
for(int j= 2; j<=n; j++)
{
int c = 0; //c表示向高位的进位
for(int i=1; i<=a[0]; i++)
{
a[i] = a[i] * j + c;//将来自低位的计算结果和本位的结果相加
if( c=a[i]/10 )
{
a[i] = a[i] % 10;
}
}

for(; c != 0; i++)
{
a[i] = c%10;
c = c / 10;
}
a[0] = i - 1;
}
clock_t runtime = clock()-time_begin;
printf("Runtime:%ld\n",runtime);

//输出
printf("位数=%d\n",a[0]);

printf("值=");
for(int x=1; x<=a[0]; x++)
{
printf("%d",a[a[0]-x+1]);
}
printf("\n");
}

#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[])
{
long n=10000;

long a[4*10000] = {0};
a[0]=1;

long i,j,c,temp,len;
temp=0;
len=1;

//计算
clock_t time_begin = clock();
for(i=1; i<=n; i++)
{
c=0;
for(j=0;j<len;j++)
{
temp=a[j]*i+c;
c=temp/100000;
a[j]=temp%100000;
}
while(c>0)
{
len=len+1;
a[len-1]=c;
c/=100000;
a[len-1]%=100000;
}
}
clock_t runtime = clock()-time_begin;
printf("Runtime:%ld\n",runtime);

//输出
printf("%ld",a[len-1]);
for(i=len-2;i>=0;i--)
printf("%05ld",a[i]);
return 0;
}

这两种的运行效率相差较大,大家还有更好的方法吗?
...全文
342 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
第一个用的是10进制来模拟,第二种是10w进制来模拟.
次数比第一次少了N多次,所以速度快
yuhan_0110 2007-10-16
  • 打赏
  • 举报
回复
在同一个机子上测试:第一种运行时间:7000;第二种运行时间:1200。

65,202

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧