2012-07-02 2 views
4

Можно создать дубликат:
How to know the repeating decimal in a fraction?Как рассчитать бесконечное значение деления?

1/3 отличается от 3/10. 0,33333! = 0,3

Так 1/3 будет 0,3 (с линией над номером три)

1/12 = 0,833333 = 0,083 (с линией над номером три)

1/13 = 0.076923076923 = 0. | 076923 |

Эти линии представляют собой повторяющуюся часть.

Я планирую иметь эту модель в классе. Я немного потерял эту ситуацию. Мне просто нужны некоторые идеи, чтобы знать, как определить повторяющуюся ценность. Благодарю.

+1

В основном, эмулировать длинное разделение. Следите за каждым остатком длительного разделения. Если вы столкнулись с остатком, который вы видели раньше, последовательность, так как вы видели, что остаток - это повторяющееся значение. – cheeken

+0

Хотя это дубликат, никто никогда не упоминает алгоритм поиска циклов в дублированном вопросе. – nhahtdh

ответ

4

На каждом шаге разделите пол, возьмите остаток, умножьте его на десять, повторите, пока не получите тот же номер.

Например, для 1/81:

1/81 = 0 with remainder 1  0 
10/81 = 0 with remainder 10  0.0 
100/81 = 1 with remainder 19 0.01 
190/81 = 2 with remainder 28 0.012 
280/81 = 3 with remainder 37 0.
... 
10/81 = 0 with remainder 10; saw this already. 
0.|| 

Вот пример реализации:

private static string GetRepeatingPart(int n, int d) { 
    var seen = new HashSet<int>(); 
    var result = new StringBuilder(); 

    n = (n % d) * 10; 

    while(true) { 
     int p = n/d; 
     n = (n % d) * 10; 

     if(seen.Contains(n)) { 
      return result.ToString(); 
     } 

     result.Append(p); 
     seen.Add(n); 
    } 
} 
+0

Это также правильный метод с пространственной сложностью O (lambda + mu) и более низкой скрытой константой для временной сложности по сравнению с O (1) пространством и более высокой скрытой константой для временной сложности алгоритма поиска циклов. – nhahtdh

Смежные вопросы