0的阶乘为什么等于1(C语言求单链表结点的阶乘和)
今天这道题目呢,阶的阶对我个人来说,乘为乘和可能是于C语难度比较大的一道题目。
因为C语言的求单许多语法我还没有提及,还有数据结构部分我也没有复习到,链表所以做这道题目的结点时候,一开始我有些无从下手的阶的阶。
不过后来仔细地分析了这道题目后,乘为乘和我感觉难度其实也还行。于C语
毕竟阶乘和是求单自己接触过的算法,也知道怎么写。链表
无非就是结点单链表结点存储数据的格式该如何写,那么就根据裁判测试程序样例来写即可。阶的阶
梳理逻辑我们在做编程题目的乘为乘和时候,首先要做的于C语,就是分析题目需求,显然,这道题目的要求是实现一个函数,求单链表L结点的阶乘和。
1、我们之前学过,阶乘就是n!=1x2x3x...xn,0的阶乘是1。
一般是用到一个for循环来写该阶乘。
for(int i = 1;i<= n;i++){ n = i*n;//n的阶乘 }2、而至于对该阶乘求和,则是定义一个变量sum。
sum=sum+n!,同理也要放在for循环当中的。
sum = sum + n;//阶乘求和但显然,这道题目的关键难度并不在于对阶乘求和,因为这个是基础部分的内容了。
关键难度在于如何根据单链表来进行阶乘求和。
3、关于题目中给出的单链表结构体,我们就不细致展开了,题目中也给了就是存储结点数据的Data,和指向下一个结点的指针Next。
因为题目给出的是结构体,我们得来谈一谈一个符号,那就是箭头“->”符号的意思。
它叫做结构体成员运算符,就是使用一个指向结构体或对象的指针访问其内部成员。
通俗点来讲,以这道题目为例:L->Data,就是指向其中的内部元素Data数量。
那么很明确,这道题目的for循环就需要以这个Data为边界点。
就可以写为:
for(int i = 1;i<=L->Data;i++){ n = i*n;//n的阶乘 }那么在当前结点的数据处理完之后,就要转移到下一个结点,来处理下一个结点的数据。
则需要用到L->Next来表示了。
L = L -> Next;最后返回sum的值即可。
注意:在完成上面这些事情的前提是L不为空,所以要加一个while循环语句:
while(L!=NULL)我们来梳理一下这整道编程题目的逻辑关系。
代码实现//求单链表结点的阶乘和#include <stdio.h>#include <stdlib.h>typedef struct Node *PtrToNode;struct Node { int Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表类型 */int FactorialSum( List L );int main(){ int N, i; List L, p; scanf("%d", &N); L = NULL; for ( i=0; i<N; i++ ) { p = (List)malloc(sizeof(struct Node)); scanf("%d", &p->Data); p->Next = L; L = p; } printf("%d\n", FactorialSum(L)); return 0;}int FactorialSum( List L ){ int sum = 0; int n = 1;//n的阶乘是从1开始的 while(L!=NULL){ for(int i = 1;i<=L->Data;i++){ n = i*n;//n的阶乘 } sum = sum + n;//求和 n = 1;//为下一个结点做准备,重新赋值为1 L = L -> Next;//指向下一个结点 } return sum;}结果测试总结总的来说,这道题目关键还是对C语言的一个基本语法要有一个了解,我正是因为对基本语法没有一个清晰的了解,才导致做这道题目的时候比较困难,需要在网上查阅相关资料,然后再来解决这道题目。