Project Euler 75

by uwi
@see http://projecteuler.net/index.php?section=problems&id=75
♥0 | Line 47 | Modified 2009-06-08 12:40:35 | MIT License
play

ActionScript3 source code

/**
 * Copyright uwi ( http://wonderfl.net/user/uwi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/wluR
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    
    // @see http://projecteuler.net/index.php?section=problems&id=75
    public class Euler75 extends Sprite {
        private var _tf : TextField;
  
        public function Euler75() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            _tf.appendText(solve().toString() + "\n");
        }
        
        private function solve() : int
        {
            var pss : Array = getPythagoreanSums(); // ピタゴラス数の和を格納
            var field : Object = {}; // <int, Boolean> 2000000までの縄の長さを格納する。valueは1回だけ登録されたらtrue, そうでなければfalse.
            for each(var ps : int in pss){
                for(var sum : int = ps;sum <= 2000000;sum += ps){
                    field[sum] = field[sum] == null;
                }
            }
            
            var ct : int = 0;
            for each(var v : Boolean in field){
                ct += v ? 1 : 0;
            }
            return ct;
        }
        
        // x^2+y^2 = z^2
        // x,y,z : coprime
        // =>
        // x = m^2-n^2, y = 2mn, z = m^2+n^2
        // x+y+z = 2m(m+n)
        private function getPythagoreanSums() : Array
        {
            var ret : Array = [];
            for(var m : int = 1;m <= 1000;m++){
                for(var n : int = 1;n < m;n++){
                    if(areCoprime(m * m - n * n, 2 * m * n)){
                        var v : int = 2 * m * (m + n);
                        if(v > 2000000)break;
                        ret.push(v);
                    }
                }
            }
            return ret;
        }
        
        // 互いに素かどうか
        private function areCoprime(a : int, b : int) : Boolean
        {
            return b == 0 ? a == 1 : areCoprime(b, a % b);
        }
    }
}