Кратчайшие десятичные представления рациональных чисел

Я хочу представить два числа в формате A/B , wWhere A и B - любые целые числа. Я хочу, чтобы десятичный результат был в кратчайшем формате.

Примеры:

  • The shortest decimal representation of 3/28 is "0.10(714285)".
  • Decimal representation of 1/7 is "0.(142857)"

Как я могу сделать это с помощью C #?

2
добавлено отредактировано
Просмотры: 1
de
Похоже, вы не просите решения для кодирования, а скорее алгоритм. Я не думаю, что это подходящий форум. Попробуйте сайт математики .
добавлено автор Paul Fleming, источник
Почему запрашивается алгоритм преобразования рациональных чисел в конкретное строковое представление из темы?
добавлено автор Martin Liversage, источник
@flem: Сайт математики предназначен для студентов-математиков и профессионалов. Наверное, лучше не беспокоить их такими мелочами. :)
добавлено автор COME FROM, источник

2 ответы

Надеюсь, кто-то может преобразовать это в код C #:

def get_decimal(a, b):
    result = str(a/b) + '.'
    r = a % b
    remainders = []
    while r not in remainders:
        remainders.append(r)
        result += str(10 * r/b)
        r = 10 * r % b
    return result

Некоторые тесты:

>>> get_decimal(1, 7)
'0.142857'
>>> get_decimal(10, 7)
'1.428571'
>>> get_decimal(3, 28)
'0.10714285'
>>> get_decimal(99099167, 990000000)
'0.100100168'

Если вам нужны скобки для указания повторяющегося набора цифр, то примерно так:

def get_decimal(a, b):
    result = str(a/b) + '.'
    r = a % b
    remainders = []
    digits = []
    while r not in remainders:
        remainders.append(r)
        digits.append(str(10 * r/b))
        r = 10 * r % b
    start = remainders.index(r)
    result += ''.join(digits[0:start]) + '(' + ''.join(digits[start:]) + ')'
    return result

Некоторые тесты:

>>> get_decimal(1, 7)
'0.(142857)'
>>> get_decimal(10, 7)
'1.(428571)'
>>> get_decimal(3, 28)
'0.10(714285)'
>>> get_decimal(99099167, 990000000)
'0.1001001(68)'
4
добавлено
@COMEFROM Да, get_decimal (121, 999) возвращает строку 0. (121) .
добавлено автор Susam Pal, источник
Это работает для 121/999 ? Должно производиться 0. (121) .
добавлено автор COME FROM, источник
Хорошо, +1. Просто не видел, чтобы это было правильно. Я должен указать, что здесь сделано только хорошее старое длинное подразделение, применяемое к остальным, возможно, во многих местах, вероятно, преподавалось в высших или даже начальных школах.
добавлено автор COME FROM, источник

Я думаю, вы хотите получить результат до двух знаков после запятой ... Для этого вы можете использовать

double result = 0.142857; 
int decimalPlaces = 2;//for two decimal places
double multiplier = Math.Pow(10, Convert.ToDouble(decimalPlaces));
result =  Math.Ceiling(result * multiplier)/multiplier;
1
добавлено
Это не отвечает на вопрос. Из 3/28 OP хочет 0.10 (714285) , указывающий повторение.
добавлено автор Paul Fleming, источник