当前位置: 代码迷 >> C语言 >> [求助]求个1000!的代码
  详细解决方案

[求助]求个1000!的代码

热度:281   发布时间:2006-12-22 22:13:43.0
[求助]求个1000!的代码

如题,没什么思路,给点算法提示吧?

搜索更多相关的解决方案: 代码  算法  思路  提示  

----------------解决方案--------------------------------------------------------
#include<stdio.h>
void main()
{
long double sun=1;
int i;
for(i=1;i<1000;i++)
{
sum*=i;
}
printf("%d",sum);
}
----------------解决方案--------------------------------------------------------

看看这个[URL=http://bbs.bc-cn.net/viewthread.php?tid=108422&extra=&page=100#][/URL]


----------------解决方案--------------------------------------------------------

http://bbs.bc-cn.net/viewthread.php?tid=108422&extra=&page=100#

[此贴子已经被作者于2006-12-22 23:34:56编辑过]


----------------解决方案--------------------------------------------------------

2楼:这个不行的,1000的阶乘结果很多行,你那会溢出。。。

[此贴子已经被作者于2006-12-22 23:44:04编辑过]


----------------解决方案--------------------------------------------------------
谢谢楼上的了,我自己都找不到
----------------解决方案--------------------------------------------------------
我 想把caiqiufu的最后一行的%d改一下可能就行啦
----------------解决方案--------------------------------------------------------


下面是1!+2!+3!+4!+4!+!+6!……+N!的源代码
里面有很大数的阶乘的算法
煮要是按位算,那么大的数,肯定不能几个字节来存放
希望有用


#include<stdio.h> /*注释,对算法可能还表达还不是很完全*/
#define N 2500 /*为了方便,把两个空间设为一样大,可以调整,以提高速度。不一定*/
long int a[N]={0}; /*运算阶乘的空间*/
long int b[N]={0}; /*盛放最后的结果*/
long int m; /*特殊算法产生的中间量,表示进位*/
long int g=0; /*输入的数*/
main()
{
headprint(); /*调用头输出*/
yunsuan(); /*运算*/
print(); /*输出*/
}

/***********头输出文件,声明作者版权,采集少量数据*******/
int headprint()
{
printf("Thanks to use this software!\n");
printf("It can help you to finish the following function:\n");
printf("F(n)=1!+2!+3!+......+(n-1)!+n!\n"); /*以上皆是友情提示*/
printf("Please enter the n:\n");
scanf("%ld",&g);
getchar(); /*核心*/
printf("running........\nPlease wait!\n");
}

/*********计算程序部分************/
int yunsuan()
{
int i,j;
for(i=1;i<=g;i++) /*运 算 主 循 环 */
{
if(i<g) /*up*/
printf("run %d\r",i); /*显示当前运行的数据,主要是有点慢,等得不耐烦,就加了这个显示*/
if(i==g) /*up与down之间的这一段,是为了显示,与运算无关*/
printf("Finish %d\n",i); /*down*/
jiecheng(&i); /*调用阶乘计算*/
qiuhe(); /*调用求和运算*/
}

}

/*******计算阶乘*******/
int jiecheng(int *p)
{
int i,j;
for(i=0;i<N;i++) /*把运算空间清零,防止造成错误*/
a[i]=0;

a[N-1]=1; /* 阶乘空间第一位(在数组中就是最后一位了)初始化为1,,要不然就没办法阶乘了,都是零*/

for(i=1;i<=*p;i++) /*阶乘主循环*/
{
for(j=N-1;j>=0;j--) /*每一位都乘阶乘数*/
{
if(a[j]!=0||m!=0||a[j-1]!=0) {
a[j]=i*a[j]+m; /*m:前一组数据传过来的进位*/
m=0; /*进位清零,其数据已经加入到数组数据中*/
if(a[j]>9999) /*为了防止数据溢出,因为乘法会产生很大数,保守起见设最大数为9999*/
{
m=a[j]/10000; /*将超过的数据放在m中*/
a[j]=a[j]%10000; /*取出数据中除去超出范围的数后,剩余的数*/
}
}
}

}

}

/*********把结果求和*****/
int qiuhe()
{
int i,j;
for(i=N-1;i>=0;i--) /*求和主循环*/
{
b[i]=b[i]+a[i]+m; /*过程与阶乘相似,不过这次是加法了*/
m=0;
if(b[i]>9999) /*为了保证加法时不会错位,只好把b的最大数也设成9999了*/
{
m=b[i]/10000;
b[i]=b[i]%10000; /*一样*/
}
}
}

/**********输出部分********/
int print()
{
int i,j;
FILE *fp;
if((fp=fopen("001","w"))==NULL) /*打开文件*/
printf("Can't open this file!\n");
for(i=0;i<N;i++)
if(b[i]) break;
for(;i<N;i++) /*此时就不用再设定i值了*/
{
printf("%ld",b[i]); /*输出到显示器*/
fprintf(fp,"%ld",b[i]); /*输出到文件*/
}
fclose(fp); /*关闭文件,经常忘了~嘿嘿~*/
printf("\n\nThe file '001' has been outputted!\n\n"); /*提示*/
getchar();
}



----------------解决方案--------------------------------------------------------
以下是引用mayudong1在2006-12-22 23:33:54的发言:

http://bbs.bc-cn.net/viewthread.php?tid=108422&extra=&page=100#


对,我也正想帖这个,那是我以前写的,应该是最精确的,不明白的地方可以跟贴提出,我将尽力解答


----------------解决方案--------------------------------------------------------
8楼所给出的程序没有编译错误,但不知道你有没有检查计算结果,计算结果不对。
很大的整数阶乘结果末尾都应该有很多0,但你给的程序1000!末尾竟然是奇数。
----------------解决方案--------------------------------------------------------
  相关解决方案