2017-08-17 104 views
-4

我們如何計算python a,b,ca^17 + b^17 = c^17的最小相對誤差爲^ 17 + b^17和c^17對a和b的值在100和10000之間?a + 17 + b^17 = c^17在Python中有最小相對誤差

amin,bmin=100,100 
minerr=1. 
for a in range(100,10001): 
    for b in range(a+1,10001): 
     c17=a**17+b**17 
     sqc17=int(pow(c17,1./17.)) 
     err=float(abs(c17-sqc17**17))/float(sqc17) 
     if err<minerr: 
      minerr=err 
      amin,bmin=a,b 
print(amin,bmin,minerr) 

我的解決辦法是不好的,因爲浮動 精度低我怎麼能改善這個

+5

我打算用Python代碼猜測,這是Python的代碼,就必須拿出自己在問一個問題這裏之前。無論多麼錯誤或錯誤,任何試圖解決問題的嘗試總比沒有好。 – tadman

+0

看起來你希望我們爲你寫一些代碼。儘管許多用戶願意爲遇險的編碼人員編寫代碼,但他們通常只在海報已嘗試自行解決問題時才提供幫助。展示這一努力的一個好方法是包含迄今爲止編寫的代碼,示例輸入(如果有),預期輸出以及實際獲得的輸出(控制檯輸出,回溯等)。您提供的細節越多,您可能會收到的答案就越多。檢查[FAQ](http://stackoverflow.com/tour)和[如何提問](http://stackoverflow.com/help/how-to-ask)。 –

+0

SO不是代碼編寫服務,請先嚐試自己的代碼,並在遇到代碼問題時提出問題。 –

回答

1

對於a<bc=b+k一個得到

a^17 = (b+k)^17-b^17 = 17*k*b^16 + 8*17*k^2*b^15 + ... 

它告訴我們,a有效的選擇是大約在(17*k/b)^(1/17)*b,這使合理的a的選擇減少了17倍。因此將環路改變爲

minerr = 1.0 
amin = 100; bmin = 100; 

for b in range(100, 1000+1): 
    for c in range(b+1, 2*b): 
     a = int(round((c**17-b**17)**(1.0/17)) 
     if a > b: break; 
     relerr = abs((1-(a**17+b**17)/float(c**17)) 
     if relerr < minerr: 
      print a,b,c,relerr 
      amin=a; bmin=b; minerr=relerr 

運行,而速度快,輸出

91 100 101 0.014295850232 
95 100 102 0.0127684524838 
91 101 102 0.0104995591939 
92 102 103 0.00622204374651 
93 103 104 0.00197150095955 
100 106 108 0.00195817126477 
107 108 112 0.00104974944998 
99 110 111 0.000393678252529 
139 158 159 3.78426050378e-05 
166 168 174 3.0425791517e-05 
186 190 196 1.5711666417e-05 
298 312 319 3.40065617555e-06 
318 323 334 1.40781743518e-06 
389 452 454 1.40251765757e-06 
543 628 631 6.18935889096e-07 
594 691 694 2.35972024587e-07 
815 993 995 5.41414728605e-08 
+0

與您的代碼我有不一樣的輸出:
91 100 101 -0.014295850232
98 100 103 -0.0341677797797
102 102 106 -0.0399996810675 – asterix

+0

有在被執行代碼的絕對值,複製粘貼錯誤。你還可以額外打印'(a ** 17 + b ** 17)**(1.0/17)'來看看'c' – LutzL