【C语言】用程序求1!+2!+3!+4!+...n!的和,来看看?
#include <stdio.h>//------先求完成求n!的程序------
int main
{int n = 0, ret = 1;;scanf("%d",&n);for(int i = 1; i<=n; i++){ret *= i;}printf("%d", ret);return 0;
}//------再求1!+2!+3!+4!+...n!------
int main()
{int n = 0, ret = 1, sum = 0;scanf("%d",&n);for (int j = 1; j <= n; j++){ret = 1;for (int i = 1; i <= j; i++){ret *= i;}sum += ret;}printf("%d\n", sum);return 0;
}//优化代码:int main()
{//求1!+2!+3!+4!+...n!int n = 0, ret = 1, sum = 0;scanf("%d",&n);for (int j = 1; j <= n; j++){ret *= j;sum += ret;}printf("%d\n", sum); //sum是求和后的结果return 0;
}
这段代码的功能是计算1! + 2! + 3! + ... + n!,其中n是用户输入的一个整数。
代码步骤:
定义变量n用于存储用户输入,ret用于计算阶乘,sum用于累加阶乘的和。
通过scanf读取用户输入的整数n。
外层循环j从1到n,每次循环计算j的阶乘。
内层循环i从1到j,计算ret = ret * i,即j的阶乘。
将每个j的阶乘ret加到sum中。
最后打印sum的值。
注意:在每次外层循环开始时,将ret重置为1,因为每次要重新计算j的阶乘。
例如,如果输入n=3,则计算1!+2!+3!=1+2+6=9。
但是,这段代码有一个潜在的问题:当n较大时,阶乘的结果可能会超出int类型的表示范围,导致溢出。
代码优化建议
效率优化:
当前实现的时间复杂度为O(n²),可以通过利用前一次阶乘结果来优化
改进方案:不需要每次都从头计算阶乘,可以利用j! = (j-1)! × j
改进代码:
#include <stdio.h>int main() {int n = 0, ret = 1, sum = 0;printf("请输入一个正整数n: ");scanf("%d", &n);for (int j = 1; j <= n; j++) {ret *= j; // 利用前一次阶乘结果sum += ret;}printf("1!+2!+...+%d! = %d\n", n, sum);return 0;
}
潜在问题
整数溢出:当n>12时,阶乘值会超过int类型的表示范围(32位系统);
解决方案:使用更大的数据类型(如long long)。