Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/47: Рейтинг темы: голосов - 47, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 27
1

Вывести на консоль бесконечную периодическую дробь с указанием периода

11.03.2016, 17:30. Показов 8595. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дана дробь. Например a - числитель, b - знаменатель. Как можно реализовать метод, возвращающий бесконечную периодическую дробь (с указанием периода), соответствующую данной обыкновенной дроби ? Т.е на консоль нужно вывести дробь типа 1.4(3)...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2016, 17:30
Ответы с готовыми решениями:

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

Как определить бесконечную дробь?
Доброго всем времени суток) Есть цикл for он выводит числа например: 4.50000000000000E-0001...

Отчет с указанием периода дат
Создал базу, настроил запрос все выдает как надо. Но в отчете надо что бы выдавало период запроса....

Найти периодическую и не периодическую части дроби
Даны взаимно простые натуральные числа p, q(p<q). Найти периодическую и не периодическую части(две...

8
52 / 52 / 24
Регистрация: 24.12.2011
Сообщений: 133
11.03.2016, 21:59 2
Дели в столбик, и, когда начнется дробная часть, начинай проверять, не начали ли повторяться цифры. Если начали - началась периодическая часть дроби.
0
BrainOverflow
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
11.03.2016, 22:06 3
Juffin, так они могут так идти:
1,43333333333356, так что тут неизвестно сколько раз проверять нужно.
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
11.03.2016, 22:17 4
Следить надо не за повторением цифр в результате, а за повторением остатков от деления.
0
52 / 52 / 24
Регистрация: 24.12.2011
Сообщений: 133
11.03.2016, 22:33 5
Да, действительно, неправильно сказал. Начинать искать повторения цифр нужно тогда, когда цифры числителя заканчиваются и начинаются нули после запятой (насколько я понимаю, числитель и знаменатель - целые числа).
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
12.03.2016, 02:08 6
Лучший ответ Сообщение было отмечено _fOrZe как решение

Решение

Например

C++
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
#include <cassert>
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
 
int main() 
{
  unsigned a = 435;
  unsigned b = 28;
 
  std::string whole = std::to_string(a / b);
 
  a %= b;
  std::string frac;
 
  std::vector<unsigned> remainders;
  do
  {
    assert(a < b);
    remainders.push_back(a);
 
    a *= 10;
 
    assert(a / b < 10);
    frac += std::to_string(a / b);
 
    a %= b;
    if (a == 0)
      break;
 
    auto r = std::find(remainders.begin(), remainders.end(), a);
    if (r != remainders.end())
    {
      size_t p = r - remainders.begin();
      frac.insert(p, 1, '(');
      frac += ')';
      break;
    }
 
  } while (true);
 
  std::cout << whole + "." + frac << std::endl;
}
15.53(571428)
Добавлено через 3 часа 28 минут
Разумеется, в данной реализации можно заменить 'std::vector remainders' на какой-нибудь эффективный ассоцитивный массив ('std::map, 'std::unordered_map'), который будет проецировать величину остатка на номер итерации, на которой этот остаток был получен. Тогда поиск повторяющегося остатка будет более эффективным (если это кого-то волнует).
1
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 27
13.03.2016, 20:11  [ТС] 7
TheCalligrapher, А можно эту задачу решить проще? И в Вашем примере у меня везде ,где используется
C++
1
std::to_string
std подчеркнуто красным. И ошибка error C2668: 'std::to_string' : ambiguous call to overloaded function
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
13.03.2016, 20:20 8
Лучший ответ Сообщение было отмечено _fOrZe как решение

Решение

Цитата Сообщение от _fOrZe Посмотреть сообщение
TheCalligrapher, А можно эту задачу решить проще?
Нельзя. (Куда уж проще-то?)

Цитата Сообщение от _fOrZe Посмотреть сообщение
И ошибка error C2668: 'std::to_string' : ambiguous call to overloaded function
Устаревший компилятор. VS 2010? Возьмите компилятор поновее. Или в VS 2010 сделайте во всех вызовах to_string приведение к типу unsigned long long

C++
1
std::to_string((unsigned long long) a / b);
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
27.12.2016, 22:19 9
Перевод обыкновенной дроби в десятичную (в т.ч. периодическую)
0
27.12.2016, 22:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2016, 22:19
Помогаю со студенческими работами здесь

Вывод warning в консоль IDE с указанием откуда вызывалась функция
#define STRING2(x) #x #define STRING(x) STRING2(x) #define PRINT_WARNING(description) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru