Project Euler 9
A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, a^2 + b^2 = c^2 For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2. There exists exactly one Pythagorean triplet for which a + b + c = 1000. Find the product abc.
ピタゴラスの三つ組(ピタゴラスの定理を満たす整数)とはa<b<cで a^2 + b^2 = c^2 を満たす数の組である. 例えば, 3^2 + 4^2 = 9 + 16 = 25 = 5^2 である. a + b + c = 1000となるピタゴラスの三つ組が一つだけ存在する. このa,b,cの積を計算しなさい.
Mathematica
a = 0; b = 0; c = 0; p = 0; For[a = 0, a <= 1000, a++, For[b = a, b <= 1000, b++, For[c = b, c <= 1000, c++, If[a + b + c == 1000 && a^2 + b^2 == c^2, Print[a, b, c], p++] ] ] ] p
pは特に意味のない値。
計算に10分弱ぐらいかかってしまい、完全に失敗プログラムです。ちなみにC言語だと1秒とまたずに結果がでたのですが。
他の人の解答例
Reduce[{a^2+b^2==c^2,a+b+c==1000,0<a<b<c},{a,b,c},Integers] Times @@ %[[All, 2]]
すぐ答えが出ました。
*1
最初はSolve*2を使おうかとも思ったのですが、不等式が条件にあるときはReduceがいいみたいですね。
C/C++
#include <iostream> using namespace std; int main(){ int i,j,k,terml,termr; for(i=1 ; i<333 ; i++){ for(j=i ; j<1000 ; j++){ k=1000-i-j; terml = i*i + j*j; termr = k*k; if(terml==termr) break; } if(terml==termr) break; } cout << i << " " << j << " " << k << " " << i*j*k << endl; }
i,j,kをa,b,cに置き直すのも面倒だったので,i,j,kをそのまま出力しちゃいました。
i<333というのは、i