题目:
从键盘输入一个值n,计算 1的阶乘 至 n的阶乘 的和,
如:输入10,计算 1的阶乘 至 n的阶乘 的和 --> 计算:1! + 2! + 3! + ... + 10!
=========================================================================
思路一:
效率比较低,会重复计算之前计算过的阶乘,但逻辑简单好理解
总体思路:
(1). 使用两个循环:内循环 和 外循环
内循环:循环生成 1~n 个数字,再依次相乘,实现1~n其中一个值的阶乘;
外循环:利用内循环计算的阶乘值,实现阶乘相加。
(2). 最后再进行打印。
第一步:
(1). 生成相关变量:()
int i = 0; -- 作为外循环的循环变量。
int j = 0; -- 作为内循环的循环变量。
int n = 0; -- 获取输入的数据。
int ret = 1; -- 把每个数的阶乘计算后赋值给该变量,
因为0乘任何数都为0,所以初始化为1。
int sum = 0; -- 内循环执行后将各个数的阶乘相加后赋值给该值,作为最终结果。
(2). 实现输入数据和获取数据 -- scanf()函数。
实现代码:
#include <stdio.h> int main() {int i = 0; //外循环int j = 0; //内循环int n = 0; //输入nint ret = 1; //把每个数的阶乘计算后赋值给该变量,因为0乘任何数都为0,所以初始化为1。int sum = 0; //外循环后将各个数的阶乘相加后赋值给该值,作为最终结果。//输入:scanf("%d", &n);//记得使用取地址符:&return 0; }
实现图片:
第二步:
(1). 编写外循环,实现各个阶乘的值相加:sum += ret;
(2). 注意:
外循环的条件变量 i 要初始化为 1:因为在内循环中要使用 i 作为循环条件,阶乘要从1开始。
每次内循环结束后要重新把 ret变量 赋值为 1:因为内循环使用变量ret实现一个值的阶乘后改变了ret的值,而轮到求下一个值的阶乘时,
还是要从1开始乘起,所以ret应该还是1的。 (效率低的原因)
实现代码:
#include <stdio.h> int main() {int i = 0; //外循环int j = 0; //内循环int n = 0; //输入nint ret = 1; //把每个数的阶乘计算后赋值给该变量,因为0乘任何数都为0,所以初始化为1。int sum = 0; //外循环后将各个数的阶乘相加后赋值给该值,作为最终结果。//输入:scanf("%d", &n);//记得使用取地址符:&//实现代码:for (i = 1; i <= n; i++) //外循环:实现阶乘相加,相加到 n!{ret = 1;//内循环中相乘后赋值给该变量,每次出了内循环后要重新刷新该变量(重点)//内循环:循环生成 1~i 个数字,再依次相乘for (j = 1; j <= i; j++){ret = ret * j;//依次相乘再赋值给变量ret}sum += ret; //将各数的阶乘相加后赋给该值}return 0; }
实现图片:
第三步:
(1). 编写内循环:循环生成 1~j 个数,再依次相乘,实现1~n其中一个值的阶乘。
(2). 注意:内循环的条件变量 j 要初始化为 1:因为在内循环中要使用 j 进行相乘,赋值为1防止0乘任何数为0。
实现代码:
#include <stdio.h> int main() {int i = 0; //外循环int j = 0; //内循环int n = 0; //输入nint ret = 1; //把每个数的阶乘计算后赋值给该变量,因为0乘任何数都为0,所以初始化为1。int sum = 0; //外循环后将各个数的阶乘相加后赋值给该值,作为最终结果。//输入:scanf("%d", &n);//记得使用取地址符:&//实现代码:for (i = 1; i <= n; i++) //外循环:实现阶乘相加,相加到 n!{ret = 1;//内循环中相乘后赋值给该变量,每次出了内循环后要重新刷新该变量(重点)//内循环:循环生成 1~i 个数字,再依次相乘for (j = 1; j <= i; j++){ret = ret * j;//依次相乘再赋值给变量ret}sum += ret; //将各数的阶乘相加后赋给该值}return 0; }
实现图片:
思路一:最终代码和实现效果:
最终代码:
#include <stdio.h> int main() {int i = 0; //外循环int j = 0; //内循环int n = 0; //输入nint ret = 1; //把每个数的阶乘计算后赋值给该变量,因为0乘任何数都为0,所以初始化为1。int sum = 0; //外循环后将各个数的阶乘相加后赋值给该值,作为最终结果。//输入:scanf("%d", &n);//记得使用取地址符:&//实现代码:for (i = 1; i <= n; i++) //外循环:实现阶乘相加,相加到 n!{ret = 1;//内循环中相乘后赋值给该变量,每次出了内循环后要重新刷新该变量(重点)//内循环:循环生成 1~i 个数字,再依次相乘for (j = 1; j <= i; j++){ret = ret * j;//依次相乘再赋值给变量ret}sum += ret; //将各数的阶乘相加后赋给该值}//打印:printf("%d\n", sum);return 0; }
实现效果:
=========================================================================
思路二:
在原本已计算的阶乘上再乘上“下一个数”,
实现“下一个数”的阶乘
总体思路:
(1). 只编写一个循环,求第一个值的阶乘后就直接赋值给sum,下一个值的阶乘直接在上一个值阶乘的基础上再乘以下一个值,得下一个值的阶乘。
(2). 最后再进行打印。
第一步:
(1). 生成相关变量:
int i = 0; -- 作为循环变量。
int n = 0; -- 获取输入的数据。
int ret = 1; -- 把每个数的阶乘计算后赋值给该变量,
因为0乘任何数都为0,所以初始化为1。
int sum = 0; -- 外循环执行后将各个数的阶乘相加后赋值给该值,作为最终结果。
(2). 实现输入数据和获取数据 -- scanf()函数。
实现代码:
#include <stdio.h> int main() {int i = 0; //循环变量int n = 0; //输入nint ret = 1; //把每个数的阶乘计算后赋值给该变量,因为0乘任何数都为0,所以初始化为1。int sum = 0; //外循环后将各个数的阶乘相加后赋值给该值,作为最终结果。//输入:scanf("%d", &n);//记得使用取地址符:&return 0; }
实现图片:
第二步:
(1). 编写循环,求完第一个数的阶乘后,直接给到sum中,求第二个数的阶乘时,再在第一个数阶乘的基础上乘上第二个数,就是第二个数的阶乘了。以此类推……
(如:输入3,求 1! + 2! + 3。
求了 1! 后赋给sum,
求 2!时,就在 1!的基础上乘 2 ,就是2的阶乘了,再赋给sum相加,实现 1! + 2!,
求 3!同理,以此类推)
(2). 注意:循环的条件变量 i 要初始化为 1:因为阶乘要从1开始。
实现代码:
#include <stdio.h> int main() {int i = 0; //循环变量int n = 0; //输入nint ret = 1; //把每个数的阶乘计算后赋值给该变量,因为0乘任何数都为0,所以初始化为1。int sum = 0; //外循环后将各个数的阶乘相加后赋值给该值,作为最终结果。//输入:scanf("%d", &n);//记得使用取地址符:&//实现代码:for (i = 1; i <= n; i++) //外循环:实现阶乘相加,相加到 n!{ret = ret * i;//依次相乘再赋值给变量retsum += ret; //将各数的阶乘相加后赋给该值}return 0; }
实现图片:
思路二:最终代码和实现效果:
最终代码:
#include <stdio.h> int main() {int i = 0; //循环变量int n = 0; //输入nint ret = 1; //把每个数的阶乘计算后赋值给该变量,因为0乘任何数都为0,所以初始化为1。int sum = 0; //外循环后将各个数的阶乘相加后赋值给该值,作为最终结果。//输入:scanf("%d", &n);//记得使用取地址符:&//实现代码:for (i = 1; i <= n; i++) //外循环:实现阶乘相加,相加到 n!{ret = ret * i;//依次相乘再赋值给变量retsum += ret; //将各数的阶乘相加后赋给该值}//打印:printf("%d\n", sum);return 0; }
实现效果: