文章目录
斐波那契数列简介
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
一、2017年网易校招题
输入一个正整数将其变为斐波那契数(最小步数)
输入描述:
输入为一个正整数K(K)
输出一个最小的步数变为Fibonacci数"
二、解题思路
1.如简介所讲,该数列可以无限大,所以不存在判断它在不在数列范围内的情况,只需要判断它是不是一个正整数即可。
2.想要判断距离两边哪个数更近,首先要知道这两个数是什么,想知道这两个数是什么就得用循环形成斐波那契数列,既然有循环就得有停止条件。
3.最后分别求出K与相邻两个斐波那契数的差用三目运算符进行比较即可得出min。想要完善一点可以输出它要经过多少步变成哪个斐波那契数。
三、源码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int f1 = 1,f2 = 1,f3 = 0;
int min = 0,k = 0,l = 0,r = 0;
scanf("%d",&k);
getchar();
puts("斐波那契数列如下");
if(k <= 3 && k > 0)
{
if(k == 3)
{
printf("%d是斐波那契数,左边是2,右边是5\n",k);
}
if(k == 2)
{
printf("%d是斐波那契数,左边是1,右边是3\n",k);
}
else if(k == 1)
{
printf("%d是斐波那契数\n",k);
}
}
else if(k > 3)
{
printf("1\n1\n");
while(1)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
printf("%d\n",f3);
l = abs(k - f1);
r = abs(k - f2);
if( f3 >= k)
break;
}
min = l < r ? l : r;
printf("%d需要%d步变成斐波那契数\n",k,min);
if(l > r)
{
printf("%d变成斐波那契数%d需要%d步\n",k,f2,r);
}
else if(l < r)
{
printf("%d变成斐波那契数%d需要%d步\n",k,f1,l);
}
else if(l = r)
{
printf("%d变成斐波那契数%d需要%d步\n",k,f1,l);
printf("%d变成斐波那契数%d需要%d步\n",k,f2,r);
}
}
else
{
printf("输入不合法\n");
}
return 0;
}
总结
第一次做的时候卡在了循环条件,预习了break语句后想出了如上代码,4这个数也是一个小bug的存在,最后给4又加了个单独判断。
目前C基础只学习到了循环语句,欢迎各位大佬前来指教简单算法。