* 这题找斐波那契数的方法是叠加法
* 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;
}
}