C语言求斐波那契数列的前20个数

环境:Visual Studio 2019

斐波那契数列:

又称黄金分割数列,因数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为兔子数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……

细心观察就会发现这个数列从第3项开始,每一项都等于前两项之和

用数学方式表示为:

Fn=F(n-1)+F(n-2)      n>=3

既然知道了这个规律那么这个问题就很简单了。


针对与这个问题

我们有两种方法可以解决:

  1. 循环
  2. 数组

循环:

#include

int main() {
int f1 = 1, f2 = 1;
	for ( int i = 1; i <=10; i++ )
	{
		printf( "%12d %12d", f1, f2 );
        //当输出4个数后换行
		if (i%2==0 ) {
			printf( "\n" );
		}
        //计算下一个数的值,并存放到f1中
		f1 = f1 + f2;
        //计算下两个的值,并存放到f2中
		f2 = f2 + f1;
	}
	printf( "\n" );
	return 0;
}

 if语句的作用是使输出4个数后换行。

i是循环变量,当i为偶数时换行,由于每次循环要输出2个数(f1,f2)

因此i为偶数也就是已经输出了4个数,输出四个数之后实现换行。

效果:

C语言求斐波那契数列的前20个数_第1张图片


数组:

在之前的循环解决这个问题中,我们定义了两个变量,程序可以顺序计算并输出各个数。

但不能在内存中保存这些数。假如用户不想要求整个数列,而只想要求数列中的某个值

数组就可以完美解决。

每一个数组元素代表数列中的一个数,依次求出各数并存放在相应的数组元素中即可。

代码:

#include

int main(){
    //等同于{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
	int f [ 20 ] = { 1,1 };
	for ( int i = 2; i < 20; i++ )
		//计算f[2]-f[19]的值
		f [ i ] = f [ i - 2 ] + f [ i - 1 ];
	for ( int i = 0; i < 20; i++ )
	{
		//控制每行输出4个数后换行
		if ( i%4==0 )
		{
			printf( "\n" );
		}
		printf( "%12d", f [ i ] );
	}
	printf( "\n" );
    return 0;
}

 因为斐波那契数列的特性,我们指定了f[0]和f[1]的值为1,剩余值为0

根据数组的特点,由前面两个元素的值可计算出第3个元素的值

f[2]=f[0]+f[1]

效果:

C语言求斐波那契数列的前20个数_第2张图片


实际上这两个代码运行起来的效果是一样的

可能看各个的运行效果不太直观

两个方法:

#include
int main() {
	//用数组来处理斐波那契数列问题
	//等同于{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
	int f [ 20 ] = { 1,1 };
	for ( int i = 2; i < 20; i++ )
		//计算f[2]-f[19]的值
		f [ i ] = f [ i - 2 ] + f [ i - 1 ];
	for ( int i = 0; i < 20; i++ )
	{
		//控制每行输出4个数后换行
		if ( i%4==0 )
		{
			printf( "\n" );
		}
		printf( "%12d", f [ i ] );
	}
	printf( "\n" );
	//用循环来处理斐波那契数列问题
	int f1 = 1, f2 = 1;
	for ( int i = 1; i <=10; i++ )
	{
		printf( "%12d %12d", f1, f2 );
		if (i%2==0 ) {
			printf( "\n" );
		}
		f1 = f1 + f2;
		f2 = f2 + f1;
	}
	printf( "\n" );
	

	return 0;
}

效果:

C语言求斐波那契数列的前20个数_第3张图片

你可能感兴趣的:(C语言,个人心得积累,c语言)