变成最近的斐波那契数列最少需要多少步

* 这题找斐波那契数的方法是叠加法
* 0 1 1 2 3 5 8 13 21 34
* a b c
*   a b c
*     a b c
* 这里可以看到一开始a=0,b=1,c=a+b
*               然后a=b,b=c,c=a+b;  a,b,c都往前一步了,找到下一个斐波那契数
*               以此循环
*             
* 思路                                       15
* 例如:斐波那契数列 0  1  1  2  3  5  8  13     21  34
* n=15时,想让它变成斐波那契额需要2步,15离13只差2

* 首先先找到n左边小于n的数,和右边大于n的数,如果n就是斐波那契数,则输出0
如n=15时,左边的斐波那契数是13,右边的斐波那契数是21
然后n-左边的数(小于n),右边的数(大于n)-n,两个数做比较谁小谁就接近斐波那契数
 

//* 这题找斐波那契数的方法是叠加法
//* 0 1 1 2 3 5 8 13 21 34
//* a b c
//*   a b c
//*     a b c
//* 这里可以看到一开始a=0,b=1,c=a+b
//*               然后a=b,b=c,c=a+b;  a,b,c都往前一步了,找到下一个斐波那契数
//*               以此循环
//*             
//* 思路                                       15
//* 例如:斐波那契数列 0  1  1  2  3  5  8  13     21  34
//* n=15时,想让它变成斐波那契额需要2步,15离13只差2
//* 
//* 首先先找到n左边小于n的数,和右边大于n的数,如果n就是斐波那契数,则输出0
//如n=15时,左边的斐波那契数是13,右边的斐波那契数是21
//然后n-左边的数(小于n),右边的数(大于n)-n,两个数做比较谁小谁就接近斐波那契数


#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int a = 0;
	int b = 1;
int c = a + b;
	while (1)                   //找到相对应的斐波那契数
	{
		if (n == a || n == b )  //如果n就是斐波那契数,则输出0
		{
			n = n==a ? a : b;
			printf("%d", 0);
			break;
		}
		else
		{
			if (n > a && n < b) //找到了n左右两边的斐波那契数看谁离得近
			{
				int com1 = n - a;
				int com2 = b - n;
				n = com1 > com2 ? com2 : com1;//将里的近的步数赋值
				printf("%d", n);
				break;
			}
		}
		//没找到n左右两边的斐波那契数,则继续寻找
		a = b;
		b = c;
		c = a + b;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值