困った時のwikipedia
昔、循環小数を100まで出力したことがあった。
pongeponge.hatenablog.jp
似たような方法を使おうかと思ったけど、どうにも時間かかりすぎる気がしたので却下。
つらつらと見てると、素数の時に長い循環節が出てくる傾向があるのに気づく。
でも気づいたのはそれだけで、それ以外の循環節の長さと数の関係がわからないのでWikipediaで調べることに。
へー。
私の方法
(1) 素数のリストを作る
(2) 大きい素数pからピックアップ
(3) 10nをpで割った余りが1になるまでnを増やす
(4) 余り1になれば、その時点のnが1/pの循環節の長さL
(5)Lよりp-1の約数が小さければ、それ以降のpは計算しない
コード
using System.Collections.Generic; using System.Diagnostics; using System.Numerics; namespace Problem26 { class Program { static void Main(string[] args) { Debug.WriteLine("RC1:" + ReciprocalCycles(1000)); } static int[] CreatePrimeArray(int max) { List<int> p = new List<int>(); for (int i = 0; i <= max; i++) { p.Add(i); } for (int i = 2; i <= max / 2; i++) { if (p[i] != 0) { for (int j = 2; p[i] * j <= max; j++) { p[i * j] = 0; } } } p.RemoveAll(obj => obj == 0); //1,2,5は巡回小数にならないので最初に削除しておく p.RemoveAt(3); p.RemoveAt(1); p.RemoveAt(0); return p.ToArray(); } static int ReciprocalCycles(int max) { int[] primes = CreatePrimeArray(max); int l = 0; int n = 0; for (int i = primes.Length-1; i >= 0; i--) { for (int d = primes[i].ToString().Length; ; d++) { if (Pow(d) % primes[i] == 1) { if (l < d) { l = d; n = primes[i]; } break; } } if (primes[i] - 1 < l) break; } return n; } static BigInteger Pow(int y) { BigInteger p = 1; for (int i = 0; i < y; i++) { p *= 10; } return p; } } }
答え
983
何か難しかったわ。

- 作者: 舛田真秋
- 発売日: 2014/11/02
- メディア: Kindle版
- この商品を含むブログを見る

環論,これはおもしろい ―素因数分解と循環小数への応用― (数学のかんどころ)
- 作者: 飯高茂,中村滋,岡部恒治,桑田孝泰
- 出版社/メーカー: 共立出版
- 発売日: 2013/01/25
- メディア: 単行本
- この商品を含むブログを見る

- 作者: 洋一石
- 出版社/メーカー: 太陽書房
- 発売日: 2005/06/01
- メディア: 単行本
- この商品を含むブログを見る