Project Euler 125

by uwi
@see http://projecteuler.net/index.php?section=problems&id=125
♥0 | Line 45 | Modified 2009-06-30 04:46:41 | 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/AuIC
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    // @see http://projecteuler.net/index.php?section=problems&id=125
    public class Euler125 extends Sprite {
        private var _tf : TextField;
  
        public function Euler125() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            _tf.appendText(solve(100000000).toString() + "\n");
            var g : int = getTimer();
            _tf.appendText((g - s).toString() + " ms\n");
        }
        
        private function solve(N : int) : Number
        {
            var sq : int = Math.sqrt(N / 2);
            // 同じ数で2通り以上の表現のものもあるんだね
            var set : Object = {};
            for(var n : int = 2;n <= sq;n++){
                var n3 : Number = n * (n + 1) * (2 * n + 1) / 6;
                for(var m : int = n - 2;m >= 0;m--){
                    var m3 : Number = m * (m + 1) * (2 * m + 1) / 6;
                    var val : Number = n3 - m3;
                    if(val >= N)break;
//                        _tf.appendText("" + val + "\n"); 
                    if(isPerindromic(val)){
//                        _tf.appendText("" + val + "\n");
                        set[val] = val;
                    }
                }
            }
            var sum : Number = 0;
            for each(var v : int in set)sum += v;
            return sum;
        } 
        
        private function isPerindromic(val : int) : Boolean
        {
            if(val % 10 == 0)return false;
            
            var a : Array = [];
            for(var i : int= val;i > 0;i /= 10)a.push(i % 10);
            for(var p : int = 0, q : int = a.length - 1;p < q && a[p] == a[q];p++, q--);
            return p >= q;
        }
    }
}