Project Euler : Problem 9 『Special Pythagorean triplet』


お店のなかにピタゴラスイッチ的な仕掛けがある。お店のなかにピタゴラスイッチ的な仕掛けがある。 / hm7hm7
projecteuler.net


問題

 ピタゴラスの定理は、直角三角形の各辺a, b, c (a < b < c)が次の関係にあることを示す。
\(a^{2} + b^{2} = c^{2}\)


 直角三角形の辺a, b, cが次の関係にあるときa, b, cはただ1つの値が定まる。
\( a + b + c = 1000 \)
\( a \times b \times c \)の値を求めよ。


パ……パイサゴラーン…トリプレット…?

 英語力の低さが露呈する厳しく悲しい現実。
最初Python*1の仲間か何かと思いましたが、
ピタゴラスの三角形(直角三角形)の事でした。


式の整理

 先に数式を整理してしまいましょう。
1000 = nと置くと、手持ちの式は
\( a+b+c=n \)
\(a^{2} + b^{2} = c^{2}\)
の2つ。


 まず、
\( c=n-a-b \)
と変形してピタゴラスの定理のcに代入する。
\( a^{2} + b^{2} = (n - a - b)^{2} \)
\( =n^{2} + a^{2} + b^{2} -2na -2nb +2ab \)
右辺と左辺にあるa2とb2が打ち消しあって、
\( n^{2} -2na -2nb +2ab = 0\)
\( 0.5n^{2} -n(a + b) +ab = 0\)
こんな式が出てくる。


 この式を満たすa, bが求まればn - a - bでcも求まって完了。
後はabcを出力するだけ。


コード
using System;
using System.Diagnostics;

namespace Problem9
{
    class Program
    {
        static void Main(string[] args)
        {
            Debug.WriteLine("Answer : {0}", Result());
        }

        static Int64 Result()
        {
            Int64 n = 1000;

            for (Int64 a = 1; a < n; a++)
            {
                for (Int64 b = a + 1; b < n; b++)
                {
                    if (a * b - n * (a + b) + 0.5 * n * n == 0)
                    {
                        Debug.WriteLine("(a, b, c)=({0}, {1}, {2})", a, b, (n - a - b));
                        return a * b * (n - a - b);
                    }
                }
            }

            return 0;
        }
    }
}
答え

 31875000


(a, b, c)=(200, 375, 425)になりました。
検算したから合ってるはず!



ピタゴラスイッチ ピタゴラゴール1号

ピタゴラスイッチ ピタゴラゴール1号

ピタゴラ装置DVDブック1

ピタゴラ装置DVDブック1

ピタゴラスイッチ うたのCD

ピタゴラスイッチ うたのCD