c语言敲出一到1000的代码,[求助]求个1000!的代码

下面是1!+2!+3!+4!+4!+!+6!……+N!的源代码

里面有很大数的阶乘的算法

煮要是按位算,那么大的数,肯定不能几个字节来存放

希望有用

#include /*注释,对算法可能还表达还不是很完全*/

#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

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

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

if(b[i]) break;

for(;i

{

printf("%ld",b[i]); /*输出到显示器*/

fprintf(fp,"%ld",b[i]); /*输出到文件*/

}

fclose(fp); /*关闭文件,经常忘了~嘿嘿~*/

printf("\n\nThe file '001' has been outputted!\n\n"); /*提示*/

getchar();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值