Project Euler 122

by uwi
10秒近くかかるから注意!
This program will spend over 10 seconds!
♥0 | Line 53 | Modified 2009-06-28 14:27:31 | 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/2oNO
 */

// 10秒近くかかるから注意!
// This program will spend over 10 seconds!
package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    // @see http://projecteuler.net/index.php?section=problems&id=122
    public class Euler122 extends Sprite {
        private var _tf : TextField;
  
        public function Euler122() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            _tf.appendText(solve().toString() + "\n");
            var g : int = getTimer();
            _tf.appendText((g - s).toString() + " ms\n");
        }
        
        private var _val : Array;
        private var _histss : Array;
        
        private function solve() : int
        {
            var i : int;
            var sum : int = 0;
            for(i = 2;i <= 200;i++){
                var v : int = calcN(i);
                _tf.appendText("" + i + "\t" + v + "\n");
                sum += v;
            }
            
            return sum;
        }
        
        private function calcN(n : int) : int 
        {
            return calcX(1, Vector.<uint>([1]), n, n);
        }
        
        private function calcX(x : int, hist : Vector.<uint>, targ : int, sup : int) : int
        {
            if(sup <= 1)return int.MAX_VALUE - 1;
            
            var min : int = sup;
            for(var v : int = hist.length - 1;v >= 0;v--){
                if(x + hist[v] == targ){
                    min = 1;
                    break;
                }
                if(x + hist[v] < targ){
                    hist.push(x + hist[v]);
                    var r : int = calcX(x + hist[v], hist, targ, min - 1) + 1;
                    if(r < min)min = r;
                    hist.pop();
                }
            }
            return min;
        }
    }
}