極值問題-(斐波那契數列)
阿新 • • 發佈:2018-12-31
已知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;
}