用C语言求350以内的阶乘

来源:百度知道 编辑:UC知道 时间:2024/06/22 12:31:06
求能运行的,谢谢大家了!

我给个程序你吧,这个程序会算出几千以内数的阶乘,像2000!时间比较快,再大点就不行了。不过1000!是瞬间出来的。代码如下(用数组存每一位数)(高精度运算 ):

#include"stdio.h"
#include"string.h"
int main()
{
char n[10];
int a[20000]={0},b[20000]={0},c[20000]={0},temp;
int i,j,k,len;
printf("请输入阶乘数:");
scanf("%s",&n);
/*下面以b为乘数,a为被乘数(依次从1到n递增)*/
temp=atoi(n);/*化整*/
b[0]=1;/*初始化b,求阶乘从1开始*/
len=1;/*初始化b的长度*/
for(i=1;i<=temp;i++)/*阶乘从低往高乘*/
{
sprintf(n,"%d",i);/*将阶乘项转换为字符串*/
for(j=strlen(n)-1;j>=0;j--)/*逆向存储阶乘项(串)*/
a[strlen(n)-1-j]=n[j]-'0';/*注意要变成整数才能进行相乘*/
for(j=0;j<len;j++)/*取b的所有位*/
for(k=0;k<strlen(n);k++)/*取阶乘项的每一位*/
{
c[j+k]+=b[j]*a[k];/*用c来存储每一位相乘的结果*/
c[j+1+k]+=c[j+k]/10;/*若c[j+k]不小于10,则将大于10的部分送至高位*/
c[j+k]%=10;/*送至高位后,c[j+k]应作相应的求余运算。只保留剩余部分*/
}
if(c[j+k-1]!=0)/*判断新的b数的位数长度*/
len=j+k;
else