読者です 読者をやめる 読者になる 読者になる

バランスを取りたい

よくCTFの記事を書きます

Project EulerをC#+LINQで解くだけ。

数学ガール1巻買いました。読み終わりました。


以前友人に借りてサクッと読んでたので、ストーリーはなんとなく覚えてたんですが、
サクッと読んだだけあってやっぱり数式の部分では忘れてるところが多かったので、新鮮な感じで読めました。


その中でオイラー先生の話が度々登場してて、そういえばProject Eulerなんてのがあったなあと思ったので、C#+LINQでProblem1,2を解いてみました。


Probrem 1

問題:1000未満の自然数で3または5で割り切れる数の総和を求めよ

int ans = Enumerable.Range(1, 999)
	.Where(x => (x % 3 == 0) || (x % 5 == 0))
	.Sum();
Console.WriteLine("The answer is " + ans);

LINQだけでサクッと書けて良い感じ。



Problem 2

問題: 400万以下の範囲のフィボナッチ数列で値が偶数の項の総和を求めよ。

long ans = Util.GetSequence(1, 1, (x, y) => x + y)
	.TakeWhile(x => x <= 4000000)
	.Where(x => x % 2 == 0)
	.Sum();
Console.WriteLine("The answer is " + ans);
public static class Util {
	public static IEnumerable<long> GetSequence(long first, long second, Func<long, long, long> relation) {
		Queue<long> q = new Queue<long>(new long[2] { first, second });
		while (true) {
			long n = q.Dequeue();
			q.Enqueue (relation(n, q.Peek()));
			yield return n;
		}
	}
}


LINQだけじゃ数列は生成できないので3項間漸化式から値を順番に返す関数を作ってUtilに突っ込みました。
ついでに2項間漸化式のも作ったり。

数列が生成できたら400万以下まで取得して奇数潰してSumするだけですね。


Problem 3以降…

素数問題がバリバリ出てきてるので素数列を生成する綺麗なコードが書けるまで保留。