Project Euler 88
@see http://projecteuler.net/index.php?section=problems&id=88
♥0 |
Line 69 |
Modified 2009-07-14 02:44:54 |
MIT License
archived:2017-03-09 17:42:35
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/7Ran
*/
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.utils.getTimer;
// @see http://projecteuler.net/index.php?section=problems&id=88
public class Euler88 extends Sprite {
private var _tf : TextField;
public function Euler88() {
_tf = new TextField();
_tf.width = 465;
_tf.height = 465;
addChild(_tf);
var s : int = getTimer();
_tf.appendText("" + solve(12000) + "\n");
var g : int = getTimer();
_tf.appendText("" + (g - s) + " ms\n");
}
private function solve(sup : int) : int
{
var mpns : Array = new Array(sup + 1);
var nfilled : int = 0;
var k : int, v : int;
for(k = 0;k <= sup;k++)mpns[k] = 0;
for(var l : int = 2;(1 << l) - l <= sup;l++){
var zs : Array = [];
for(var i : int = 0;i < l;i++)zs.push(2);
do{
var mul : int = 1;
var sum : int = 0;
for each(var z : int in zs){
mul *= z;
sum += z;
}
v = mul - sum + l;
if(v >= 0 && v <= sup){
if(!mpns[v]){
mpns[v] = mul;
nfilled++;
}else if(mpns[v] > mul){
mpns[v] = mul;
}
}
}while(zs = next(zs, sup - l));
}
// _tf.appendText(mpns + "\n");
var set : Object = {};
for each(v in mpns){
set[v] = v;
}
_tf.appendText("fill : " + nfilled + "\n");
var ret : int = 0;
for each(v in set)ret += v;
return ret;
}
private function next(zs : Array, lim : int) : Array
{
for(var p : int = zs.length - 1;p >= 0;p--){
zs[p]++;
for(var i : int = p + 1;i < zs.length;i++)zs[i] = zs[p];
var mul : int = 1;
var sum : int = 0;
for each(var z : int in zs){
mul *= z;
sum += z;
}
if(mul - sum <= lim)break;
}
// _tf.appendText(zs + "\n");
return p == -1 ? null : zs;
}
}
}