Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。
输入为一个正整数N(1 ≤ N ≤ 1,000,000)
输出一个最小的步数变为Fibonacci数"
15
2
分享一个比较常规的解法,然后再去学习一些大神的解法 学习到的一个大道至简的写法,5行Python大法好: n = int(input()) f1,f2 = 0,1 while n>f2: f1,f2 = f2,f1+f2 print(min(f2-n,abs(n-f1)))
"""看到dalao们什么最短路啊 快速幂的 有点受惊吓 这就是道水题啊""" def judge(n): x,y=0,1 while y<n: x,y=y,x+y print(min(y-n,n-x)) judge(int(input())) """也可以这样嘛“”“def dfs(a,b,c):
if c<b:
print(min(c-a,b-c))
else:
dfs(b,a+b,c)
num=int(input())
dfs(0,1,num)
def nStep(N): fn0=0 fn1=1 fn=0 #计算斐波那契数,直到大于当前值才停止 ,由于使用 的是迭代 方法求得的斐波纳,因此容易得知小于N的斐波那契数 while N>fn: fn=fn0+fn1 fn0=fn1 fn1=fn df1=N-fn0 df2=fn-N #判断前后两个斐波纳数哪个离N比较近 if N==fn: return 0 elif df1>df2: return df2 else: return df1 if __name__=='__main__': n=int(input()) print(nStep(n))
跟有人的方法类似:原理就是找到两个连续的Fibonacci数, 并且我们输入的那个数就是在这两个Fibonacci数之间, 然后输出较小的绝对值 s=int(input()) m=0 n=1 while n <= s: b=m+n m=n n=b if abs(s-m) > abs(s-n): print (abs(s-n)) else: print (abs(s-m))