天天看點

極值問題(acms)

【問題描述】

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

① m、n∈{1,2,…,k},即1≤m,n≤k,(1≤k≤109)。

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

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

【輸入樣例】

1995

【輸出樣例】

m=987

n=1597

極值問題(acms)

代碼如下:

極值問題(acms)
極值問題(acms)

View Code

批注:該算法确實挺好,簡潔、高效率,但是有一個問題比較明顯,那就是當k的值達到10^9時,for循環内,m從k開始向1周遊。當m的值取10^9時,計算delt的時候,m^2會溢出。而且并非隻有當k達到10^9才會有這個問題,當k達到10^5時就會出現這個問題。想要自己寫一個函數去實作高精度數的開平方根,似乎也不是這麼容易。是以,可以看看下面的遞推算法。

标準答案是:

極值問題(acms)
極值問題(acms)

批注:一開始閱讀該算法,實在無法了解為何會是跟斐波那契數列一樣的規律。後來查資料,閱讀了解,終于看懂。下面做一個記錄。