C#のLINQを素因数分解に使ってみる
因数ごとにグループ化し、グループのメンバー数をCountメソッドで取得/表示する。
各グループは同じ素数なのでどれでもよいのだが今回はFirstメソッドで取得した。
/*
Factoring
ulong max : 18,446,744,073,709,551,615
18446744073709551615
*/
using System;
using System.Collections.Generic;
using System.Linq;
namespace MyFactoring
{
static class Program
{
[STAThread]
static void Main(string[] args)
{
var list = new List<ulong>();
ulong num, i;
Console.WriteLine("Enter ulong number");
num = ulong.Parse(Console.ReadLine());
Console.WriteLine("num = {0}", num);
for ( i=2; i<= num; i++ ){
while ( num % i == 0 ){
list.Add(i);
num /= i;
}
}
var grps = list.GroupBy(a=>a);
foreach( var c in grps )
{
Console.WriteLine($"{c.First()} - - - {c.Count()}");
}
}
}
}
※コピー&ペーストするとインデントがおかしくなってしまう、なぜ???
◎実行例
PS >.\factoring.exe
Enter ulong number
18446744073709551615
num = 18446744073709551615
3 - - - 1
5 - - - 1
17 - - - 1
257 - - - 1
641 - - - 1
65537 - - - 1
6700417 - - - 1
以上