题目:给你一个N,想让其变成一个Ficonacci数,每一步可以进行+1,-1操作,求最少需要多少步可以变为Ficonacci数?
首先要实现这个题目,就先要实现斐波那契数列的函数和判断一个数是否为斐波那契数的函数。我们都知道斐波那契数列如何实现,在此也不做赘述。
如何判断一个数是否为斐波那契数呢?如果一个数是斐波那契数,直接返回1判断他是;如果他不是,那么我们知道他肯定会夹在两个斐波那契数之间,我们只需要利用这点就可以轻松解决。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Fib(int x)//斐波那契函数
{
if (x == 1)
return 0;
else if (x == 2)
return 1;
else
{
int a = 0;
int b = 1;
int m = 0;
for (int i = x - 2; i > 0; i--)
{
m = a + b;
a = b;
b = m;
}
return m;
}
}
int IsFib(int x)
{
for (int i = 1; Fib(i) < x; i++)
{
if (Fib(i + 1) == x)
return 1;
}
/*循环条件判断为当前第i个斐波那契数是否小于x,如果小于则进入循环判断
下一个斐波那契数是否等于x,若等于返回1,否则i++继续循环;当第i个斐波
那契数大于x时则判断x不是斐波那契数,跳出循环返回0.*/
return 0;
}
int main()
{
int n = 0;
scanf("%d", &n);
int m = n;
int count1 = 0, count2 = 0;
while (IsFib(m) != 1)
{
m++;
count1++;
}
//此循环判断加的步长
m = n;
while (IsFib(m) != 1)
{
m--;
count2++;
}
//此循环判断减的步长
printf("%d", (count1 > count2 ? count2 : count1));
return 0;
}