环境:Visual Studio 2019
斐波那契数列:
又称黄金分割数列,因数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为兔子数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……
细心观察就会发现这个数列从第3项开始,每一项都等于前两项之和
用数学方式表示为:
Fn=F(n-1)+F(n-2) n>=3
既然知道了这个规律那么这个问题就很简单了。
针对与这个问题
我们有两种方法可以解决:
#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个数,输出四个数之后实现换行。
效果:
在之前的循环解决这个问题中,我们定义了两个变量,程序可以顺序计算并输出各个数。
但不能在内存中保存这些数。假如用户不想要求整个数列,而只想要求数列中的某个值
数组就可以完美解决。
每一个数组元素代表数列中的一个数,依次求出各数并存放在相应的数组元素中即可。
代码:
#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]
效果:
实际上这两个代码运行起来的效果是一样的
可能看各个的运行效果不太直观
两个方法:
#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;
}
效果: