C语言:计算 1! + 2! + 3! + ... + n!

简介: 思路一:效率比较低,会重复计算之前计算过的阶乘,但逻辑简单好理解

                     

思路一:

效率比较低,会重复计算之前计算过的阶乘,但逻辑简单好理解

总体思路:

(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; //输入n
  int ret = 1; //把每个数的阶乘计算后赋值给该变量,因为0乘任何数都为0,所以初始化为1。
  int sum = 0; //外循环后将各个数的阶乘相加后赋值给该值,作为最终结果。
  //输入:
  scanf("%d", &n);//记得使用取地址符:&
  return 0;
}

实现图片:

image.png

第二步:

(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; //输入n
  int 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;
}


实现图片:

image.png


第三步:

(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; //输入n
  int 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;
}

实现图片:

image.png

思路一:最终代码和实现效果:

最终代码:

#include <stdio.h>
int main()
{
  int i = 0; //外循环
  int j = 0; //内循环
  int n = 0; //输入n
  int 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;
}

实现效果:

image.png

思路二:

在原本已计算的阶乘上再乘上“下一个数”,

实现“下一个数”的阶乘

总体思路:

(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; //输入n
  int ret = 1; //把每个数的阶乘计算后赋值给该变量,因为0乘任何数都为0,所以初始化为1。
  int sum = 0; //外循环后将各个数的阶乘相加后赋值给该值,作为最终结果。
  //输入:
  scanf("%d", &n);//记得使用取地址符:&
  return 0;
}

实现图片:

image.png

               

第二步:

(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; //输入n
  int ret = 1; //把每个数的阶乘计算后赋值给该变量,因为0乘任何数都为0,所以初始化为1。
  int sum = 0; //外循环后将各个数的阶乘相加后赋值给该值,作为最终结果。
  //输入:
  scanf("%d", &n);//记得使用取地址符:&
  //实现代码:
  for (i = 1; i <= n; i++) //外循环:实现阶乘相加,相加到 n!
  {
    ret = ret * i;//依次相乘再赋值给变量ret
    sum += ret; //将各数的阶乘相加后赋给该值
  }
  return 0;
}

实现图片:

image.png

路二:最终代码和实现效果:

最终代码:

#include <stdio.h>
int main()
{
  int i = 0; //循环变量
  int n = 0; //输入n
  int ret = 1; //把每个数的阶乘计算后赋值给该变量,因为0乘任何数都为0,所以初始化为1。
  int sum = 0; //外循环后将各个数的阶乘相加后赋值给该值,作为最终结果。
  //输入:
  scanf("%d", &n);//记得使用取地址符:&
  //实现代码:
  for (i = 1; i <= n; i++) //外循环:实现阶乘相加,相加到 n!
  {
    ret = ret * i;//依次相乘再赋值给变量ret
    sum += ret; //将各数的阶乘相加后赋给该值
  }
  //打印:
  printf("%d\n", sum);
  return 0;
}

实现效果:

a62a2e1133de41efab1740108da79477.png

相关文章
|
2月前
|
C语言
【C语言】库宏offsetof(结构体成员偏移量计算宏)
【C语言】库宏offsetof(结构体成员偏移量计算宏)
27 0
|
2月前
|
编译器 C语言
【C语言】strlen()函数(字符串长度计算函数)
【C语言】strlen()函数(字符串长度计算函数)
41 0
|
2月前
|
存储 编译器 Linux
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
|
20天前
|
存储 C语言
【C语言刷题每日一题#牛客网HJ73】——计算日期到天数转换(给定日期,计算是该年的第几天)
【C语言刷题每日一题#牛客网HJ73】——计算日期到天数转换(给定日期,计算是该年的第几天)
|
20天前
|
存储 安全 C语言
【C语言刷题每日一题】——求最大公约数(带数学计算过程详解)
【C语言刷题每日一题】——求最大公约数(带数学计算过程详解)
|
20天前
|
存储 C语言
【C语言刷题每日一题】——计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
【C语言刷题每日一题】——计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
|
1月前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
22 2
|
20天前
|
C语言
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)
|
24天前
|
C语言
C语言-----计算两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
C语言-----计算两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
13 0
|
24天前
|
Serverless C语言
C语言----递归函数,计算一个非负整数的数字之和
C语言----递归函数,计算一个非负整数的数字之和
22 0