如何優雅地用C語言實現階乘運算——四種方法?

Tags: 語言, 階乘,

對於C/C++初學者來說,可能會經常遇到如計算階乘等問題。對於計算階乘,一般人可能很輕易的就掌握了利用定義和循環來解決。但在博大精深的編程世界裡,還有很多種實現階乘的方法:如調用函數,利用遞歸,利用靜態變量等等,掌握了這些,你的程序將更加優雅,更加高逼格~祝大家C語言學習愉快。

工具/原料

我是在VS2012上編寫運行的,但C標準是一致的,其他的編譯器也不會有問題

方法/步驟

第一種:利用定義和for循環

試驗:輸入8,結果:8!=40320

程序代碼如下:

//=======================

//原1.c

//利用定義實現階乘

//-----------------------

#include

main()

{

int n,m=1,pro=1;//pro,即product,乘積

printf("Input n:");

scanf("%d",&n);

for(;m<=n;++m)

pro=pro*m;

printf("%d!=%d\n",n,pro);

}//===========================

如何優雅地用C語言實現階乘運算——四種方法

第二種:調用函數

在C語言的模塊設計中,可以利用定義和循環,設計一個專門計算階乘的函數

fact(int),這樣設計,以後如果遇到計算階乘問題,可以直接套用函數,十分方便。

試驗:輸入 9,結果:9!=362880

程序代碼如下:

//=======================

//原2.c

//調用函數實現階乘

//-----------------------

#include

main()

{

int n;

int fact(int);//實現階乘的函數

printf("Input n:");

scanf("%d",&n);

printf("%d!=%d\n",n,fact(n));

}

int fact(int n)

{

int pro=1;

int m=1;

for(;m<=n;++m)

pro=pro*m;

return(pro);

}//===========================

如何優雅地用C語言實現階乘運算——四種方法

第三種,遞歸計算

在第二種調用函數的思想下,我們改進算法,利用遞歸運算,思路立馬脫離了循環的桎梏

試驗:輸入10,結果:10!=3628800

程序代碼如下:

//=======================

//原3.c

//利用遞歸實現階乘

//-----------------------

#include

main()

{

int n;

int fact(int);//實現階乘的函數

printf("Input n:");

scanf("%d",&n);

printf("%d!=%d\n",n,fact(n));

}

int fact(int n)

{

int pro;//pro,即product,乘積,

if(n<=1)

pro=1;

else

pro=n*fact(n-1);

return(pro);

}//===========================

如何優雅地用C語言實現階乘運算——四種方法

第四種,利用靜態變量實現階乘

如果我們在C語言的學習更加深入一點,我們還會了解到靜態變量(static)的特點,這時候利用靜態變量實現階乘也是別開生路。

試驗:輸入11,結果11!=39916800

程序代碼如下:

//=======================

//原4.c

//利用靜態變量實現階乘

//-----------------------

#include

main()

{

int n,m=1,pro;

long fact(int);//實現階乘的函數

printf("Input n:");

scanf("%d",&n);

for(;m<=n;m++)

pro=fact(m);

printf("%d!=%ld\n",n,pro);

}

long fact(int n)

{

static long pro=1;//pro,即product,乘積,

pro=pro*n;

return(pro);

}//===========================

如何優雅地用C語言實現階乘運算——四種方法

總結:

由於階乘是一個變化速度非常快的函數,對於較大數的階乘的運算可能以上程序結果會溢出,這種情況下可以考慮把int型換成long型甚至是long long型;相應的,函數參數也要改動為 long fact(int),long long fact(int),long pro, long long pro,輸出格式也要把第二個%d改為%ld。

但是,即便這樣,仍不能解決大整數的階乘問題,如1000!,在這種情況下我們還有更好的辦法去處理,而這,將在後面的學習中學到。祝大家學習愉快。

相關問題答案