前回の補足ネタです。
1479のように、左から右へどんどん大きな数字になってゆく数を、ここでは「上昇数」と呼んでいます。
上昇数の例として上げられている1479は素数ではありません(3で割り切れる)。さて「エマープでかつ上昇数」という自然数はあるのでしょうか?
まず上昇数は「左から右へどんどん大きな数字になってゆく数」です。ということは121は上昇数ではないといえます。ところで11234はどうなのでしょうか?「左から右へどんどん大きな数字」になっていない(上二桁が1で同じ)ので上昇数とはいえないのでしょうか? だとすれば上昇数の最大値は123,456,789になります。
Contents
上昇数をリストアップする
まずは上昇数のリストを作成しましょう。
最初に一桁の整数だけを格納したリストを作成します。そしてこのリストを格納したリスト(List> lists)をGetIntListsOfRises(int keta)メソッドに渡します。
GetIntListsOfRises(int keta)メソッドのなかではGetIntListsOfRises2(List> list, int keta)メソッドが再帰呼び出しされ、格納されている整数が上昇していくリストのリストを取得することができます。
あとはGetLongFromIntList(List
GetNumberOfRises(2, 9)を実行してみると2桁から9桁までの上昇数は502個あることがわかります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
List<long> GetNumberOfRises(int minKeta, int maxKeta) { List<long> longs = new List<long>(); for(int i = minKeta; i <= maxKeta; i++) { var intLists = GetIntListsOfRises(i); foreach(List<int> intList in intLists) { longs.Add(GetLongFromIntList(intList)); } } return longs; } List<List<int>> GetIntListsOfRises(int keta) { List<List<int>> lists = new List<List<int>>(); for(int i=1; i<=9; i++) { List<int> vs = new List<int>(); vs.Add(i); lists.Add(vs); } return GetIntListsOfRises2(lists, keta).Where(x => x.Count == keta).ToList(); } List<List<int>> GetIntListsOfRises2(List<List<int>> lists, int keta) { if(lists.Count == 0 || lists[0].Count >= keta) return lists; List<List<int>> newList = new List<List<int>>(); foreach(List<int> vs in lists) { int last = vs.Last(); for(int i = last+1; i <= 9; i++) { List<int> intList = vs.ToList(); intList.Add(i); newList.Add(intList); } } return GetIntListsOfRises2(newList, keta); } long GetLongFromIntList(List<int> list) { string str = ""; foreach(int i in list) { str += i.ToString(); } return long.Parse(str); } |
上昇数でエマープの自然数は?
あとは取得できた上昇数がエマープであるかどうか調べるだけです。上昇数がエマープである最大の自然数は1,235,789であるということがわかりました。
1 2 3 4 5 6 7 |
private void button1_Click(object sender, EventArgs e) { List<long> longs = GetNumberOfRises(2, 9); string[] vs = longs.Where(x => IsEmirp(x) == Emirp.Emirp).Select(x => x.ToString()).ToArray(); richTextBox1.Text = string.Join("\n", vs); } |
上昇数でエマープなのは以下の26個の自然数です。
13
17
37
79
149
157
167
179
347
359
389
1,237
1,249
1,259
1,279
1,789
3,467
3,469
12,689
13,457
13,469
13,789
15,679
34,589
345,689
1,235,789