Project Euler 75
@see http://projecteuler.net/index.php?section=problems&id=75
♥0 |
Line 47 |
Modified 2009-06-08 12:40:35 |
MIT License
archived:2017-03-30 04:58:25
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/wluR
*/
package {
import flash.display.Sprite;
import flash.text.TextField;
// @see http://projecteuler.net/index.php?section=problems&id=75
public class Euler75 extends Sprite {
private var _tf : TextField;
public function Euler75() {
_tf = new TextField();
_tf.width = 465;
_tf.height = 465;
addChild(_tf);
_tf.appendText(solve().toString() + "\n");
}
private function solve() : int
{
var pss : Array = getPythagoreanSums(); // ピタゴラス数の和を格納
var field : Object = {}; // <int, Boolean> 2000000までの縄の長さを格納する。valueは1回だけ登録されたらtrue, そうでなければfalse.
for each(var ps : int in pss){
for(var sum : int = ps;sum <= 2000000;sum += ps){
field[sum] = field[sum] == null;
}
}
var ct : int = 0;
for each(var v : Boolean in field){
ct += v ? 1 : 0;
}
return ct;
}
// x^2+y^2 = z^2
// x,y,z : coprime
// =>
// x = m^2-n^2, y = 2mn, z = m^2+n^2
// x+y+z = 2m(m+n)
private function getPythagoreanSums() : Array
{
var ret : Array = [];
for(var m : int = 1;m <= 1000;m++){
for(var n : int = 1;n < m;n++){
if(areCoprime(m * m - n * n, 2 * m * n)){
var v : int = 2 * m * (m + n);
if(v > 2000000)break;
ret.push(v);
}
}
}
return ret;
}
// 互いに素かどうか
private function areCoprime(a : int, b : int) : Boolean
{
return b == 0 ? a == 1 : areCoprime(b, a % b);
}
}
}