Project Euler 128

by uwi
@see http://projecteuler.net/index.php?section=problems&id=128
♥0 | Line 62 | Modified 2009-07-31 19:44:47 | 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/jo6r
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    // @see http://projecteuler.net/index.php?section=problems&id=128
    public class Euler128 extends Sprite {
        private var _tf : TextField;
  
        public function Euler128() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            t(solve(2000));
            var g : int = getTimer();
            t((g - s) + " ms");
        }

        // 1の真上の系列とその右下の系列のみ調べればよい。
        private function solve(M : int) : Number
        {
            var ct : int = 1;
            var ret : Number;
            var r : int;
            for(r = 1;r < 100000;r++){
                if(
                    r > 1 &&
                    isPrime(12 * r + 5) &&
                    isPrime(6 * r + 1) && 
                    isPrime(6 * r - 1)
                ){
                    ct++;
                    ret = 3 * r * r - 3 * r + 2;
//                    t(ret);
                    if(ct == M)return ret;
                }
                if(
                    isPrime(12 * r - 7) &&
                    isPrime(6 * r + 5) && 
                    isPrime(6 * r - 1)
                ){
                    ct++;
                    ret = 3 * r * r + 3 * r + 1;
//                    t(ret);
                    if(ct == M)return ret;
                }
            }
            return 0;
        }
        
        private function isPrime(n : Number) : Boolean
        {
            if(n <= 1)return false;
            if(n % 2 == 0)return n == 2;
            
            var sq : int = Math.sqrt(n);
            for(var i : int = 3;i <= sq;i+=2){
                if(n % i == 0){
                    return false;
                }
            }
            return true;
        }
	private function t(o : *) : void
	{
            _tf.appendText("" + o + "\n");
	}
    }
}