步子百科步子百科

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语言的一个基本语法要有一个了解,我正是因为对基本语法没有一个清晰的了解,才导致做这道题目的时候比较困难,需要在网上查阅相关资料,然后再来解决这道题目。