1. 程式人生 > >C++ 求階乘 四種方法

C++ 求階乘 四種方法

           來總結下求階乘的各種方法哈。

           寫在最前:①各個程式碼只是提供了求階乘的思路,以便在實際需要時再來編碼,程式碼並不健壯!②各個程式都在1到10內測試正確。

           程式碼一:

#include<iostream>
using namespace std;

int fac(int);

int main()
{
	int n;

	while(cin>>n)
	{
		cout<<n<<"!= "<<fac(n)<<endl;
	}

	return 0;
}

int fac(int x)
{
	register int i,f=1;  //定義暫存器變數

	for(i=1;i<=x;i++)
		f*=i;

	return f;
}

            分析:該程式在每次輸入n時,都會呼叫fac()來暴力計算以得到結果。

            程式碼二:

#include<iostream>
using namespace std;

int a[11];

void init();

int main()
{
	init();

	int n;

	while(cin>>n)
	{
		cout<<n<<"!= "<<a[n]<<endl;
	}

	return 0;
}

void init()
{
	int i;

	a[0]=1;
	for(i=1;i<=10;i++)
		a[i]=i*a[i-1];
}

             分析:該程式利用了陣列記錄已得到的結果,並在計算下一個結果時利用了已得到的結果。

             程式碼三:

#include<iostream>
using namespace std;

int fac(int);

int main()
{
	int i;

	for(i=1;i<=10;i++)
	{
        cout<<i<<"!= "<<fac(i)<<endl;
	}

	return 0;
}

int fac(int x)
{
	static int f=1;   //靜態區域性變數

	f*=x;

	return f;
}

             分析:應該說該程式碼實用性最差,主要是來學習靜態區域性變數來了。

            程式碼四:

#include<iostream>
using namespace std;

int fac(int);

int main()
{
	int n;

	while(cin>>n)
	{
		cout<<n<<"!= "<<fac(n)<<endl;
	}

	return 0;
}

int fac(int x)   //遞迴函式
{
	int f;

	if(x==0 || x==1)
		f=1;
	else
		f=fac(x-1)*x;

	return f;
}

             分析:一直認為遞迴技術很神奇。雖然在時間和空間方面都不是很理想,但的確允許我們利用了以“模糊”的方式程式設計。對每個細節不必錙銖必較了。

             寫在最後:程式是個很神奇的東西。程式設計是個很重要的能力。

             歡迎拍磚!