這是相當'數學-y',但我在這裏發佈,因爲它是一個歐拉項目問題,&我有工作代碼,可能有錯誤。十進制小數中最長的循環週期 - 錯誤還是誤解?
Determing longest repeating cycle in a decimal expansion問題使用對數解決了這個問題,但我很想用簡單的蠻力解決問題。更準確地說,我有興趣瞭解爲什麼我的算法和代碼沒有返回正確的解決方案。
的算法是簡單的:
- 複製「長除法」,
- 在每個步驟記錄中的除數,而其餘
- 當重複除數/餘數元組,推斷出該小數代表將重複。
這裏是私人領域,如要求
private int numerator;
private int recurrence;
private int result;
private int resultRecurrence;
private List<dynamic> digits;
這裏是代碼:
private void Go()
{
foreach (var i in primes)
{
digits = new List<dynamic>();
numerator = 1;
recurrence = 0;
while (numerator != 0)
{
numerator *= 10;
// quotient
var q = numerator/i;
// remainder
var r = numerator % i;
digits.Add(new { Divisor = q, Remainder = r });
// if we've found a repetition then break out
var m = digits.Where(p => p.Divisor == q && p.Remainder == r).ToList();
if (m.Count > 1)
{
recurrence = digits.LastIndexOf(m[0]) - digits.IndexOf(m[0]);
break;
}
numerator = r;
}
if (recurrence > resultRecurrence)
{
resultRecurrence = recurrence;
result = i;
}
}}
當測試整數< 10和20 <我得到正確的結果;我也正確地確定了i
的價值。然而,我得到的十進制表示是不正確的 - 我計算i-1
而正確的結果是少得多(類似i-250
)。
所以想必我有一個編程錯誤 - 我找不到 - 或者一個邏輯錯誤。
我很困惑,因爲它對我來說就像是一個multiplicative group over p,其中會有p-1個元素。我確定我錯過了一些東西,任何人都可以提供建議嗎?
編輯
我不會包括我的素數的代碼 - 這是不相關的,我解釋我上面正確識別的i
值(從內存是983),但我有問題獲得resultRecurrence
的正確值。
你能告訴我們你編寫代碼的語言嗎?我認爲這是JavaScript,然後意識到它不可能。 –
@Phil - 添加c#標籤 - 這不是一個特定於c#的問題,但我想標籤屬於。 –
你可以發佈整個代碼,其中變量'primes','digits','numerator','recurrence','resultRecurrence'和'result'被聲明嗎?如果這些是方法的參數,請向我們展示方法簽名以及如何調用它。 –