Hatena::Groupactionscript

nitoyon.dispatchEvent(null)

 | 

2010-04-17

Project Euler #33

| 19:15 | Project Euler #33 - nitoyon.dispatchEvent(null) を含むブックマーク はてなブックマーク - Project Euler #33 - nitoyon.dispatchEvent(null)

49/98は面白い分数である. 「分子・分母の9をキャンセルしたので 49/98 = 4/8 が得られた」と経験を積んでいない数学者が誤って思い込んでしまうかもしれないからである.

我々は 30/50 = 3/5 のようなタイプ自明な例だとする.

1より小さく分子・分母がともに2桁の数になるような自明でない分数は 4個ある.

その4個の分数の積が約分された形で与えられたとき, 分母の値を答えよ.

Problem 33 - PukiWiki

分母・分子ともに2桁の数なので、10/11~98/99 を全て試せばOK。答えが少し意表をつく値だったので何かミスしたかと思ったが正解だった。不思議だ。

package{
import flash.display.Sprite;
import flash.text.TextField;

public class Problem33 extends Sprite{
    private var t:TextField = TextField(addChild(new TextField()));

    public function Problem33(){
        var n:Array = [];
        var d:Array = [];
        for (var i:int = 10; i < 99; i++) {
            for (var j:int = i + 1; j < 100; j++) {
                if (i % 10 == 0 && j % 10 == 0) break;
                if (isOk(i, j)) {
                    n.push(i);
                    d.push(j);
                }
            }
        }

        var nn:int = 1, dd:int = 1;
        for (i = 0; i < 4; i++) {
            nn *= n[i];
            dd *= d[i];
        }
        var g:int = gcm(nn, dd);

        t.text = (dd / g) + "\n" + nn + "/" + dd + "\n" + n.join(",") + "\n" + d.join(",");
    }

    private function gcm(a:int, b:int):int {
        if (a < b) return gcm(b, a);
        if (a % b == 0) return b;
        return gcm(a - b, b);
    }

    private function isOk(i:int , j:int):Boolean {
        var arri:Array = [i % 10, int(i / 10)];
        var arrj:Array = [j % 10, int(j / 10)];
        for (var ii:int = 0; ii < 2; ii++) {
            for (var jj:int = 0; jj < 2; jj++) {
                if (arri[ii] == arrj[jj] && i / j == arri[1 - ii] / arrj[1 - jj]) {
                    return true;
                }
            }
        }
        return false;
    }
}
}
 |