正整数最小步变成斐波拉契数

文章目录


斐波那契数列简介

斐波那契数列(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)(≥ 2,∈ 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基础只学习到了循环语句,欢迎各位大佬前来指教简单算法。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值