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

亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

唐突にProjectEulerでも。

C#

ちょっと時間がないのでお茶をにごすんですよ。はい。

2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

2520は1〜10までの数で余り無く割れる数のうち最小の数である。では、1-20までの数で、同様に余り無く割れる最小の数は一体いくつだろうか。

普通に解くのは当然面白く無いですよねぇ。なんか面白い解き方できないかなあ・・・。
とりあえず、ワンライナー

var val = Enumerable.Range(1,int.MaxValue - 1).First(i => Enumerable.Range(1,20).All(j => i % j == 0));

まあ、めちゃくちゃ時間かかりますけどね。。。

あー、これ解析的に解けるよな、そういえば。こんな感じで。

	var numList = Enumerable.Range(1,20);
	var dividerList = new List<int>();
	
	for(int i = 2; i <= 20; i++)
	{
		while(numList.Any( ele => ele % i == 0))
		{
			dividerList.Add(i);
			numList = numList.Select( ele => ele % i == 0 ? ele / i : ele).ToList();//Enumerate immediately
		}
	}
	var val = 1;
	dividerList.ForEach(ele => val *= ele);

うん、早い早い!あとはこれをもうちょっときれいにしたいけれど・・・ばたんきゅ。