數的階乘,想必大家都不陌生,原理也很清楚,就是給定一個正整數,然後求出所有小于以及等于該正整數的積。
這裡我們要清楚幾點:
1、負數沒有階乘,所以默認是正整數。
2、0的階乘是1,這是人為規定的,隻需要記住即可。
那麼,今天我們的重點是用C語言實現數的階乘,不過我提出了一個要求:利用我們前些天所學的知識,用函數以及遞歸函數的方法來實現數的階乘。
這樣的話,既能幫助我們複習函數和遞歸函數的方法,也能鞏固我們的C語言基礎。
在正式用C語言實現數的階乘前,我們先來理一理邏輯。
數的階乘,除了0的階乘是1外,正整數的階乘就是所有小于以及等于它的積。
給定一個數為5,那麼5的階乘就是5!=1x2x3x4x5 = 120。
這裡我們需要用到一個循環,就是不停地遍曆比5小的數即可。
遍曆出1、2、3、4、5之後,再不停地進行相乘。
初始值為1,那麼第一次相乘為1,第二次就是1與2相乘,直到第五次就是前四次相乘的積與5相乘,最終得到120。
首先是給出流程圖,方便大家理解。用三種方法進行代碼實現
第一種:普通的直接在主函數中寫出所有代碼。
用該方法就比較直觀了,就是遍曆給定數,從1開始到它本身,然後不停相乘,注意,我在這裡一開始用了給定數來相乘,但其實這是有問題的,還是得從1開始,畢竟1的階乘是從1開始的。
#include<stdio.h>
int main()
{
int number;
int factorial = 1;//因為factorial是階乘的英文
scanf("%d", &number);
for(int i=1; i<=number; i ) {
factorial = i*factorial;//這樣是确保即便當number=0的時候,結果也為1
}
printf("%d ", factorial);
}
測試結果:
第二種:在主函數外寫一個子函數,然後在主函數内直接進行調用該子函數。
#include<stdio.h>
void factorial(){
int number;
int factorial = 1;//因為factorial是階乘的英文
scanf("%d", &number);
for(int i=1; i<=number; i ) {
factorial = i*factorial;//這樣是确保即便當number=0的時候,結果也為1
}
printf("%d ", factorial);
}
int main()
{
factorial();//可以說,就是直接把主要代碼這部分給拎出來,然後在主函數調用
}
其實可以發現,這與我們上面的直接在主函數裡寫的方法沒什麼差别,唯一的區别就是看起來更加直觀一些,以及代碼錯落有緻一點。
測試結果:
第三種:在主函數外寫一個遞歸函數,也就是讓子函數不停調用它自身。
與前兩個方法相比,遞歸函數顯然更好理解一些,也顯然讓代碼的利用率更高了,因為0的階乘是0,所以這應該單獨進行判斷,也就是得到結果為1,之後就是讓它本身與比它小的數相乘了。
其實這個邏輯很好理解,給定數5,然後5去與factorial(4)相乘,同時factorial(4)又是4與factorial(3)相乘,與此推理下去,直到最小是與1相乘即可,那就滿足了從1開始到它本身的所有數相乘。
#include<stdio.h>
int factorial(int n){
if(n<=0){
return 1;
}
return n*factorial(n-1);//與比它小的正整數相乘
}
int main()
{
int number = 0;
scanf("%d", &number);
printf("%d\n",factorial(number));
//與之前相比,顯然變得更簡單了些
}
測試結果:
總結
總的來說,階乘其實蠻簡單的,就是大家的思維要再打開一些,不要局限于隻用一種方法來實現,多利用之前學過的一些方法,代碼的利用率還能變高,也能提升自己的編程能力。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!