c语言有子函数阶乘求和 c语言中阶乘求和

c语言求阶乘累加和题目中数据很大
于是我们有了高精度算法
思路是什么呢:
一个数组里面每一位存的是十进制数三位(也可以只存一位 , 但是比较慢)
也可以理解成一千进制
这样能模拟大整数的乘法、加法
#includestdio.h
#includestring.h
#define max(a,b) (ab?a:b)
int n;
FILE * input, * output;
struct bigint
{
int len;
int num[1100];
}fac,sum;
void mul(int value){//高精度乘单精度
int i;
for (i=1;i=fac.len;i)
fac.num[i]=fac.num[i]*value;//每个数位乘上数
for (i=1;i=fac.len;i)
if (fac.num[i]=1000) {//逢千进一
fac.num[i 1] =fac.num[i]/1000;fac.num[i]%=1000;
}
if (fac.num[fac.len 1]) fac.len;//位数可能会增加,而且最多增加1
}
void add()//给sum加上fac的值
{
int i;
//由于此时fac永远大于sum所以不用判断sum的长度
for (i=1;i=fac.len;i)
sum.num[i] =fac.num[i];//每一位加上fac的值
for (i=1;i=fac.len;i)
if (sum.num[i]=1000){//逢千进一
sum.num[i 1];sum.num[i]-=1000;//因为加法运算不可能往前进2
}
sum.len =fac.len;
if (sum.num[sum.len 1]) sum.len;
}
void out()//输出
{
int i;
for (i=sum.len;i=1;i--)
{
if (isum.len) //压位高精度一定要判断位数
【c语言有子函数阶乘求和 c语言中阶乘求和】{//因为如果不是第一位,其他要补0,因为如果这个数是1001,就会变成11
if (sum.num[i]10) fprintf(output,"00");
else if (sum.num[i]100) fprintf(output,"0");
}
fprintf(output,"%d",sum.num[i]);
}
fputc('\n',output);
}
int main(){
input = fopen("factor.in","r");
output = fopen("factor.out","w");
memset(fac.num,0,sizeof fac.num);
memset(sum.num,0,sizeof sum.num);
fscanf(input,"%d",n);
int i;
fac.len = sum.len = 1;//初始赋成1
fac.num[1] = sum.num[1] = 1;
for (i=2;i=n;i)
{
mul(i);
add();
}
out();
fclose(input);fclose(output);
return 0;
}
【在线等】c语言程序:对n的阶乘求和,n=1到10分析下程序,阶乘可以用递归做 , 也可以用循环做,这里就放上这两种代码了 。
一.递归:
#include stdio.h
int f(int t)
{
if (t==1)
return 1;
else
return t*f(t-1);
}
int main()
{
printf("%d\n",f(10));
return 0;
}
程序分析:定义一个f函数,利用递归的特性,进行运算
10*f(9) = 10*9*f(8) …… 直到到1时返回1
得出结果:
二.循环:
#include stdio.h
int main()
{
int t1=1;
for(int i=10;i=1;i--)
{
t1 = t1*i;
}
printf("%d", t1);
return 0;
}
程序分析:直接用一个for循环进行自减即可完成,定义t1用于存储结果
得出结果:
c语言求阶乘的和1 #include stdio.h
2 int main()
3 {
4 int i=0;
5 long temp=1;
6 long sum=0;
7 for(i=1;i=20;i)
8 {
9 temp*=i;
10 sum =temp;
11 }
12 printf("sum=%ld\n",sum);
13 return 0;
14 }
___________________
cl之后,执行:
____________________
Microsoft (R) 32-bit C/COptimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
baidu.c
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/out:baidu.exe
baidu.obj
sum=268040729
请按 ENTER 或其它命令继续
_________________
to 楼上:
你的for里边的sum1每次重新从1开始算,很浪费的,直接用上一次的结果就行.
c语言有子函数阶乘求和的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言中阶乘求和、c语言有子函数阶乘求和的信息别忘了在本站进行查找喔 。

    推荐阅读