Project Euler 122
10秒近くかかるから注意!
This program will spend over 10 seconds!
♥0 |
Line 53 |
Modified 2009-06-28 14:27:31 |
MIT License
archived:2017-03-09 17:43:49
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;
}
}
}