Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/35: Рейтинг темы: голосов - 35, средняя оценка - 4.77
 Аватар для prosst
0 / 0 / 0
Регистрация: 25.09.2009
Сообщений: 8

Перевести простую пробь в десятичную

11.01.2010, 23:57. Показов 6931. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
доброго времини суток!

в программировании я новичек. мне подкинули задачку:

умеется числитель и знаменатель простой дроби - натуральные числа. дробь правильная
нада написать программу которая переводит простую пробь в десятичную и если имеется период то записывает его как в математике "0.(число в периоде)"

может ктото подскажет какую то закономерность по какой можно оперделить какие числа будут в периоде
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.01.2010, 23:57
Ответы с готовыми решениями:

Перевести простую программку с Delphi
Имеется программа на Delphi. Нужно перевести на C++ procedure TForm1.Button1Click(Sender: TObject); var s, sum, i, j, n: integer; p:...

Перевести простую прогу с С++ на Assembler
Нужно перести часть кода на асемблер. Для тех кто шарит работы на 2 минуты, самому не получаеться написать. ( часть программы потом сделать...

Как перевести из 16-ричной в десятичную
В Мемо3 отображаются числа в 16-ричной с.с., которые приходят с com-порта. Потом они (не все) считываются с Мемо3 и открываются в...

6
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
12.01.2010, 00:20
Цитата Сообщение от prosst Посмотреть сообщение
может ктото подскажет какую то закономерность по какой можно оперделить какие числа будут в периоде
Делаем деление столбиком (или уголком, как его там зовут), и когда при получении цифр после запятой попадётся остаток, который уже встретился ранее (тоже после запятой), между одинаковыми остатками будет период.
0
Day
 Аватар для Day
1180 / 990 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
13.01.2010, 13:47
Хорошая задачка!
А то все матрицы, да матрицы...
Алгоритм простой - в 5-м классе, кажется, проходили.
Пусть N - числитель, M - знаменатель ( N < M - дробь правильная)
a: N *= 10;
c = N / M; // это очередная цифра
N = N % M;
// Точка истины
goto a;
Если N стало = 0, получилась точная десятичная дробь,
вычисления заканчиваем
Как поймать возникновение периода?
Очевидно, период возникает, как только N повторит одно из своих
предыдущих значений.
Этих значений < M
Поэтому заводим массив int x[M], x[i] - номер шага, на котором N==i
По началу все x[i] = 0.
Останавливаемся тогда, когда x[N] != 0
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <alloc.h>
Drob(int NN, int M)
{
  long N = NN;   // исходное значение нам еще понадобится
 // Пришлось вместо int использовать long N, т.к. при умножении на 10
 // даже такого небольшего числа, как 3720, N > MAX_INT
  int c, i, step, period, dop, flag;
  int *x;
 
  printf(" %d / %d =\n", NN, M);
  x = (int *)malloc(M * sizeof(int));
  for(i=0; i<M; i++) x[i] = 0;
  step = 1;
  while(1) {
    N *= 10;
    c = N / M;
    N = N % M;
       // Точка истины
    if (N==0) {
      printf("точная десятитичная дробь\n");
      period = 0;
      break;
    }
    if (x[N]!=0) {
      period = step - x[N];
      dop = x[N] - 1;  // Сколько цифр надо печатать до периода
      printf("Периодическая дробь, длина периода = %d dop=%d\n", period, dop);
      break;
    }
    x[N] = step;
    step++;
  }
      // Теперь число печатаем
  printf("0.");
  N = NN;
  i = 0;
  flag = 0;
  while(1) {
    if (flag==0 && period && i >= dop) {
      printf("(");
      flag = 1;  // Флаг - печатаем период
      i = 0;
    }
    N *= 10;
    c = N / M;
    printf("%d", c);
    N = N % M;
    if (N==0) break;
    if (period==0) continue; // Для точной дроби все что ниже - не нужно
    i++;
    if (flag && i >= period) {
      printf(")\n");
      break;
    }
  }
}
/*****************/
main(int argc, char *argv[])
{
   if (argc<3) exit(1);
   Drob(atoi(argv[1]), atoi(argv[2]));
}
/**************/
Запуск: drob.exe числитель знаменатель

Наверное, можно сделать и поизящнее, но этот вариант как-будто работает
2
 Аватар для prosst
0 / 0 / 0
Регистрация: 25.09.2009
Сообщений: 8
13.01.2010, 18:45  [ТС]
я и не думал что все так сложно)

спс Day
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.09.2012, 10:54
Day, ошибочка у вас. Не учтены первые нули для знаменателя > 10
Вот исправленный вариант
Перевод обыкновенной дроби в десятичную (в т.ч. периодическую)
1
Day
 Аватар для Day
1180 / 990 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
08.09.2012, 11:14
Байт, спасибо за критику и исправления.
Но и ты не без греха.
У тебя 1/11 = 0.0(90)
Арифметически это верно, но положено все-таки 0.(09)
Так что давай думать дальше...
1
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
08.09.2012, 23:47
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
 
class RepeatingDecimal
{
public:
    typedef unsigned number_type;
    RepeatingDecimal(number_type numerator, number_type denominator);
    friend std::ostream& operator<<(std::ostream& out, const RepeatingDecimal& repeatingDecimal);
private:
    std::string resultAsString;
};
 
RepeatingDecimal::RepeatingDecimal(number_type numerator, number_type denominator)
{
    std::ostringstream sout;
    sout.exceptions(std::ostringstream::badbit | std::ostringstream::failbit);
    sout << numerator / denominator;
    numerator %= denominator;
    if (numerator != 0)
    {
        sout << '.';
        std::vector<number_type> digits, remainders{numerator};
        while (true)
        {
            numerator *= 10;
            digits.push_back(numerator / denominator);
            numerator %= denominator;
            auto repetitionStartRem =
                std::find(remainders.begin(), remainders.end(), numerator);
            if (repetitionStartRem != remainders.end())
            {
                auto repetitionStart =
                    digits.begin() + (repetitionStartRem - remainders.begin());
                std::copy(
                    digits.begin(), repetitionStart,
                    std::ostream_iterator<number_type>(sout)
                    );
                sout << '(';
                std::copy(
                    repetitionStart, digits.end(),
                    std::ostream_iterator<number_type>(sout)
                    );
                sout << ')';
                break;
            }
            remainders.push_back(numerator);
        }
    }
    resultAsString = sout.str();
}
 
std::ostream& operator<<(std::ostream& out, const RepeatingDecimal& repeatingDecimal)
{
    return out << repeatingDecimal.resultAsString;
}
 
int main(int argc, char* argv[])
{
    using namespace std;
 
    if (argc < 3)
    {
        cerr << "Error: too few arguments" << endl;
        return 1;
    }
 
    istringstream argin;
    unsigned numerator, denominator;
    argin.str(argv[1]);
    argin >> numerator;
    if (!argin || argin.peek() != istringstream::traits_type::eof())
    {
        cerr << "Error: invalid argument: " << argv[1] << endl;
        return 1;
    }
    argin.clear();
    argin.str(argv[2]);
    argin >> denominator;
    if (!argin || argin.peek() != istringstream::traits_type::eof())
    {
        cerr << "Error: invalid argument: " << argv[2] << endl;
        return 1;
    }
    cout << RepeatingDecimal(numerator, denominator);
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.09.2012, 23:47
Помогаю со студенческими работами здесь

перевести в десятичную систему 41.5(восмиричная)
система исчисления: перевести в десятичную систему 41.5(восмиричная)

Перевести числа в десятичную систему
Хола амигос! Для задания использовать цифры 542 и 254. Перевести числа в десятичную систему. В данном задании точка в числе выделяет...

Перевести десятичную дробь в рациональную
Проблема в условии. Как быть,если например дробь 0,75? Racional:: Racional( double &amp; num ) { int kolvo=0;//кол-во знаков после запятой...

Перевести число в десятичную систему счисления
Дана последовательность из пяти символов, представляющая число в шестнадцатеричной системе счисления. Перевести число в десятичную систему...

Перевести число из двоичной записи в десятичную
Дана строка, изображающая двоичную запись целого положительного числа. Вывести строку, изображающую десятичную запись этого же числа....


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru