2017-08-17 6 views
-4

どのように私たちはPython a、b、ca^17 + b^17 = c^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)と[How to Ask](http://stackoverflow.com/help/how-to-ask)を参照してください。 –

+0

SOはコード作成サービスではありませんので、まず自分のコードを試してください。コードに問題が発生した場合は、質問してください。 –

答えて

1
a<bについては

c=b+k 1はaための有効な選択肢であることを教えてくれる

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

を取得し、どのように改善する可能性があるため、フロート の低精度の悪いです(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

Iは同じ出力いない。
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

関連する問題