今天這道題目呢,對我個人來說,可能是難度比較大的一道題目。
因為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語言的一個基本語法要有一個了解,我正是因為對基本語法沒有一個清晰的了解,才導緻做這道題目的時候比較困難,需要在網上查閱相關資料,然後再來解決這道題目。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!