C++ 求阶乘 四种方法

 来总结下求阶乘的各种方法哈。

写在最前:①各个代码只是提供了求阶乘的思路,以便在实际需要时再来编码,代码并不健壮!②各个程序都在1到10内测试正确。

 

代码一:

[cpp] view plaincopyprint?
  1. #include<iostream>
  2. usingnamespace std;
  3. int fac(int);
  4. int main()
  5. {
  6. int n;
  7. while(cin>>n)
  8. {
  9. cout<<n<<"!= "<<fac(n)<<endl;
  10. }
  11. return 0;
  12. }
  13. int fac(int x)
  14. {
  15. registerint i,f=1; //定义寄存器变量
  16. for(i=1;i<=x;i++)
  17. f*=i;
  18. return f;
  19. }
#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()来暴力计算以得到结果。

 

代码二:

[cpp] view plaincopyprint?
  1. #include<iostream>
  2. usingnamespace std;
  3. int a[11];
  4. void init();
  5. int main()
  6. {
  7. init();
  8. int n;
  9. while(cin>>n)
  10. {
  11. cout<<n<<"!= "<<a[n]<<endl;
  12. }
  13. return 0;
  14. }
  15. void init()
  16. {
  17. int i;
  18. a[0]=1;
  19. for(i=1;i<=10;i++)
  20. a[i]=i*a[i-1];
  21. }
#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];
}

分析:该程序利用了数组记录已得到的结果,并在计算下一个结果时利用了已得到的结果。

 

代码三:

[cpp] view plaincopyprint?
  1. #include<iostream>
  2. usingnamespace std;
  3. int fac(int);
  4. int main()
  5. {
  6. int i;
  7. for(i=1;i<=10;i++)
  8. {
  9. cout<<i<<"!= "<<fac(i)<<endl;
  10. }
  11. return 0;
  12. }
  13. int fac(int x)
  14. {
  15. staticint f=1; //静态局部变量
  16. f*=x;
  17. return f;
  18. }
#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;
}

分析:应该说该代码实用性最差,主要是来学习静态局部变量来了。

 

代码四:

[cpp] view plaincopyprint?
  1. #include<iostream>
  2. usingnamespace std;
  3. int fac(int);
  4. int main()
  5. {
  6. int n;
  7. while(cin>>n)
  8. {
  9. cout<<n<<"!= "<<fac(n)<<endl;
  10. }
  11. return 0;
  12. }
  13. int fac(int x) //递归函数
  14. {
  15. int f;
  16. if(x==0 || x==1)
  17. f=1;
  18. else
  19. f=fac(x-1)*x;
  20. return f;
  21. }
#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;
}

分析:一直认为递归技术很神奇。虽然在时间和空间方面都不是很理想,但的确允许我们利用了以“模糊”的方式编程。对每个细节不必锱铢必较了。

原文链接: https://www.cnblogs.com/szwencan/archive/2012/11/07/2758418.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++ 求阶乘 四种方法

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/68478

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午1:21
下一篇 2023年2月9日 下午1:21

相关推荐