1. 程式人生 > >極值問題-(斐波那契數列)

極值問題-(斐波那契數列)

已知m、n為整數,且滿足下列兩個條件:

    ① m、n∈{1,2,…,k},即1≤m,n≤k

    ②(n2-m*n-m2)2=1

   你的任務是:程式設計輸入正整數k(1≤k≤109),求一組滿足上述兩個條件的m、n,並且使m2+n2的值最大。例如,從鍵盤輸入k=1995,則輸出:m=987   n=1597。

輸入

輸入正整數k(1≤k≤109)
輸出

輸出滿足條件的m、n,並且使m2+n2的值最大。
樣例輸入

1995
樣例輸出

m=987
n=1597

分析 咋一看好像很麻煩的, 開動機智的小腦袋瓜就可以想出來啦hhhh
咳咳 其實是對條件中的公式進行變形
(n^2 -n*m-m^2)^2=1
( m^2+n*m-n^2 )^2 =1
( m^2+n*m-n^2 )= m^2+2*n*m+n^2-m*n-2*n^2;
( m^2+n*m-n^2 )=(m+n)^2-m*n-2*n^2;
綜上 可推出

(n^2 -n*m-m^2)^2=((m+n)^2-(m+n)*n-n^2)^2
即 m->n,n->m+n;
嘿嘿嘿 這個時候 我們從最簡單的情況帶入;
帶入m=1時,解出n=1;
帶入m=2時,解出n=3;
帶入m=3時,解出n=5;
帶入m=4時,無解;
帶入 m=5時,解出n=8;
……….
1,1,2,3,5,8,……..這 這 這 不就是傳說中的斐波那契數列嘛??!!!
得出規律,n,m時斐波那契數列中相鄰的兩個數。即 求出斐波那契數列中<=k的相鄰的兩個數即可。 如果還是不理解的話 就看程式碼吧。

#include<bits/stdc++.h>
using namespace std; int n,m,k; int main (void){ while(cin>>k){ int n=1,m=1,p=m+n; while(p<=k){m=n,n=p,p=m+n;} printf("m=%d\nn=%d",m,n); } return 0; }