C语言实现求n!以及阶乘之和1!+2!+3!…+(n-1)!+n!
多种逻辑思考编码
一个属于程序设计入门的案例练习,下面我将会一步步引导进入逻辑编码思路,希望对大家有所帮助,也希望和大家一起在程序设计语言这条路上越走越远,越走越好!!!
1.求n!
算法思想:关于求解阶乘的问题首先我们一定要理解阶乘的定义,所谓阶乘的定义我所理解的就是阶数递减乘到1,类比理解一下,好比说3的阶乘是3×2×1=6;9的阶乘是9×8×7×6×5×4×3×2×1;那么n的阶乘就是n×(n-1)×…×3×2×1。
- 具体的操作:
利用循环;设置一个循环变量为i初始值为0,i从1到n;依次让i与变量ret相乘并将乘积赋值给变量ret,输出变量ret。
(变量ret初始化为1,不能为0;若是初始化为0,相乘始终为0,输出结果就是错误的了)
-
步骤
①导入库函数,定义主函数;
②定义变量i初始化为0;定义变量n初始化为0;定义变量ret初始化为1;
③for循环实现乘积
④输出
#include <stdio> int main() { int ret = 1;//定义阶乘 int n = 0; int i = 0; printf("please input n:"); scanf("%d",&n); for (i = 1;i <= n;i++) //注意这里要等于 不然阶数-1算不对的 { //1*2*3*4*...*n ret *= i;//等于ret = ret * i } printf("%d\n",ret); return 0; }
到这里我们就基本实现阶乘的算法了,下面我们该思考如何对每一阶的阶乘进行一个累积相加的行为
2.求1!+2!+3!…+(n-1)!+n!
方法一
算法思想:在上述阶乘的定义概念下,定义一个sum变量对阶乘之和进行接收,套用两层for循环,这里需要注意的是第一个for循环计算n的阶乘之前,要把ret初始为1,原因很简单,因为是求和,所以每一次求的ret阶乘都是独立的,最后再进行相加。
#include <stdio.h>
int main()
{
int ret = 1;
int sum = 0;
int n = 0;
int i = 0;
printf("please input n:");
scanf("%d",&n);
for (n = 1;n <= n;n++)
{
ret = 1;//计算n的阶乘之前,把ret初始为1
for ( i = 1; i < n; i++)
{
ret *= i;
}
sum += ret;
}
printf("%d\n",ret);
printf("%d\n",sum);
return 0;
}
到这里我们就基本实现阶乘求和的算法了,但是套用两层for循环的算法在时间空间的复杂度上相对于一层for循环而言是比较高的,而且每次在累加时都需要重新计算n的阶乘,下面我们就来看看一层for循环的实现优化的操作。
方法二
#include <stdio.h>
int main()
{
int sum = 0;
int ret = 1;
int n = 0;
int i = 0;
printf("please input n:");
scanf("%d",&n);
for (i = 1;i <= n;i++) //注意这里要等于 不然阶数-1算不对的
{
//1*2*3*4*...*n
ret *= i;//sum = sum * i
//1!+2!+3#+...+n!
sum += ret;
}
printf("%d\n",ret);
printf("%d\n",sum);
return 0;
}
3.我更喜欢函数调用的方法去实现我们的目标,是我的matlab老师和我的好朋友教给我的一个非常宝贵的学习方式!
算法思想:编写一个计算阶乘的函数,在主函数实现求和时调用我们的阶乘函数。
#include <stdio.h>
//定义阶乘函数
int JC(int n)
{
int i = 0;//要用到for循环所以定义变量i,初始化为0是一个个人习惯
int ret = 1;
for(i = 1;i <= n;i++)
{
ret *= i;
}
return ret;
}
//主函数实现求和
int main()
{
int j = 0;//主函数求和也是利用循环的思想所以定义变量j初始化为0
int sum = 0;//和初始化为0
int n = 0;
printf("please input n:");
scanf("%d",&n);
for(j = 1;j <= n;j++)
{
sum += JC(j);
}
printf("%d",sum);
return 0;
}
总结:代码书写的过程中对于目标的实现一定要有自己的认识才能形成逻辑思路,遇到那里不懂我们就去弄懂那里,代码的实现过程也要自己亲力亲为那才属于自己的积累,不积硅步无以至千里,做好积累是学习的开始。在编写代码完成目标实现时我们不能仅仅满足于基本实现目的,而应多思考一点,横向纵向扩展思维,考虑如何让自己的代码更高效,尽量避免重复的操作和计算就是一个很好的细节开始。
那么到这里,Chan的第一篇程序设计文章就到这里啦!!我们下次再见~