c语言计算3阶行列式(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语言的一个基本语法要有一个了解,我正是因为对基本语法没有一个清晰的了解,才导致做这道题目的时候比较困难,需要在网上查阅相关资料,然后再来解决这道题目。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com