Форум программистов, компьютерный форум CyberForum.ru

Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 65, средняя оценка - 4.95
алишка999
1 / 1 / 0
Регистрация: 01.09.2012
Сообщений: 30
07.09.2012, 09:38     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #1
составить программу перевода обыкновенной дроби в периодическую
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
07.09.2012, 09:40     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #2
а если дробь не периодическая, например 1/2 ?
алишка999
1 / 1 / 0
Регистрация: 01.09.2012
Сообщений: 30
07.09.2012, 09:48  [ТС]     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #3
тоже можно
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
07.09.2012, 09:52     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #4
что можно?
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
07.09.2012, 10:34     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #5
Перевести простую пробь в десятичную
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2012, 22:12     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #6
алишка999, посмотри сюда Бесконечная точность при делении
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
07.09.2012, 23:05     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #7
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
91
92
93
94
95
96
97
98
99
100
101
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <set>
#include <string>
#include <sstream>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string         T_str;
typedef std::vector<int>    T_numerators;
/////////////////////////////////////////////////////////////////////////////////////////
T_str  get_cyclic_number
    (
        int     numerator,
        int     denominator
    )
{
    std::ostringstream  sout;        
    sout    <<  numerator / denominator
            <<  '.';  
 
    T_str           fractional_part; 
    T_numerators    numerators;
    for(;;)
    {
        numerator   %=  denominator;
        numerator   *= 10;
 
        char    dig_char    =   char
                                    (
                                        '0' +   numerator / denominator
                                    );
        
        int     prev_dig_pos    =       std::find
                                            (
                                                numerators.begin(),
                                                numerators.end(),
                                                numerator
                                            )
                                    -   numerators.begin();
 
        if  (
                prev_dig_pos    ==  numerators.size()      
            )
        {
            fractional_part     .push_back( dig_char    );
            numerators          .push_back( numerator   );
        }
        else
        {
            fractional_part.insert
                (
                    prev_dig_pos,
                    "("
                );
            
            sout    <<  fractional_part
                    <<  ')';
            break;
        }
    }
    return  sout.str();
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    for(;;)
    {
        std::cout   <<  "numerator"
                    <<  '\t'
                    <<  "= ";
 
        int     numerator       =   0;
        std::cin    >>  numerator;
 
        std::cout   <<  "denominator"
                    <<  '\t'
                    <<  "= ";
 
        int     denominator     =   0;
        std::cin    >>  denominator ;
 
        if(denominator == 0)
        {
            break;
        }
 
        std::cout   <<  "cyclic_number"
                    <<  '\t'
                    <<  "= "
                    <<  get_cyclic_number
                            (
                                numerator,
                                denominator
                            )
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl;    
    }   
}
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
08.09.2012, 00:13     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #8
Mr.X,
может я ошибаюсь но по моему твоя прога
число е=2.718281828........
почитает переодической и напишет 2.7(1828)
по моему задача в таком ключе
Цитата Сообщение от алишка999 Посмотреть сообщение
составить программу перевода обыкновенной дроби в периодическую
не решаема ведь есть бесконечные непереодические дроби
(число Пи число е)
необходимо вводить ограничение, например не более 10 знаков после запятой
тогда можно будет проанализировать
да и период может быть какой угодно хоть 100 знаков
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.09.2012, 00:37     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #9
Рациональные числа (именно это обычно понимается под словами "обыкновенная дробь") однозначно* представляются в виде конечной или периодической десятичной дроби.
______
* Если без казуистики 0,(9) = 1.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
08.09.2012, 01:20     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #10
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
однозначно* представляются в виде конечной или периодической десятичной дроби.
например
1/7 = 0,14285714285714285714285714285714=0,(142857) период 6 знаков
1/707=0,00141442715700141442715700141443=0,(001414427157) период 12 знаков
1/7007=1,4271442842871414299985728557157e-4 разрядной сетки калькулятора не хватило для определения периода
а можно еще 1/700...7
теоретически они периодические
а практически???
нужно ограничение в условии
Цитата Сообщение от ValeryS Посмотреть сообщение
период может быть какой угодно хоть 100 знаков
Добавлено через 3 минуты
или знать законы периодических дробей и программировать их
но эту область математики я не знаю

Добавлено через 3 минуты
1/103=0,00970873786407766990291262135922
это переодическая дробь или нет???
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.09.2012, 01:26     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #11
Ограниченность разрядной сетки и вытекающие из этого ошибки — это половые трудности компьютера. Я говорил с точки зрения математики. Тем более, что это особо не мешает считать периоды.

1/103 = 0,00(9708737864077669902912621359223300)

У 1/97, кстати, длиннее :)
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
08.09.2012, 01:31     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #12
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Я говорил с точки зрения математики.
и я про тоже
нужно знать закон образования периода и от него танцевать
а не тупо делить

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
1/103 = 0,00(9708737864077669902912621359223300)
знаешь? или как то рассчитал?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.09.2012, 01:34     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #13
Цитата Сообщение от ValeryS Посмотреть сообщение
знаешь? или как то рассчитал?
Да, блин, наизусть помню. И 96 цифр периода 1/97 тоже.

Здесь глянул. Для алгоритма расчёта расписываем деление в столбик и внимательно на него смотрим. Просто переводить только назад, из десятичной в обыкновенную.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
08.09.2012, 01:49     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #14
~OhMyGodSoLong~, спасибо за ссылку
ну я и оторвался
1/100003 - period 50001
1/10000003 - period 769230
че неужели тоже столбиком делят?

Добавлено через 3 минуты
1/1000000303 а здесь умер
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.09.2012, 01:54     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #15
Why not? Это не так сложно. Судя по тому, как долго считаются периоды для дробей посложнее, именно так.

Но я нубло в теории чисел, может, для 1/n есть какие-то быстрые способы с разложением на простые числа знаменателя. Способы просто узнать период.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
08.09.2012, 02:23     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #16
~OhMyGodSoLong~, кстати 1/103 = 0,00(9708737864077669902912621359223300) там посчитано неверно, правильно считает моя программа:
1/103 = 0.(0097087378640776699029126213592233), так как, согласно Википедии,
"Можно показать, что чисто периодические дроби соответствуют рациональным числам, в записи которых в виде несократимой дроби p/q, знаменатель q не имеет простых делителей 2 и 5, а также рациональным числам p/q, у которых знаменатель q имеет только простые делители 2 и 5. Соответственно, смешанные периодические дроби соответствуют несократимым дробям p/q, знаменатель q которых имеет как простые делители 2 или 5, так и отличные от них."
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
08.09.2012, 02:40     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #17
Цитата Сообщение от Kastaneda Посмотреть сообщение
что можно?
0,4(9)

-=ЮрА=-
Заблокирован
Автор FAQ
08.09.2012, 10:09     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #18
Цитата Сообщение от Mr.X Посмотреть сообщение
~OhMyGodSoLong~, кстати 1/103 = 0,00(9708737864077669902912621359223300) там посчитано неверно, правильно считает моя программа:
1/103 = 0.(0097087378640776699029126213592233), так как, согласно Википедии,
"Можно показать, что чисто периодические дроби соответствуют рациональным числам, в записи которых в виде несократимой дроби p/q, знаменатель q не имеет простых делителей 2 и 5, а также рациональным числам p/q, у которых знаменатель q имеет только простые делители 2 и 5. Соответственно, смешанные периодические дроби соответствуют несократимым дробям p/q, знаменатель q которых имеет как простые делители 2 или 5, так и отличные от них."
-
мой алгоритм
Бесконечная точность при делении
тоже показал такой период

Вот период дроби 1/103 = 0,(0097087378640776699029126213592233)

1 / 103 = 0.00970873786407766990291262135922330097087378640776699029126213592233
0097087378640776699029126213592233
0097087378640776699029126213592233009708737864077669902912621359223300970873786407766990291262135922330097087378640776699029126213592233009708737864
07766990291262135922330097087378640776699029126213592233009708737864077669902912621359223300970873786407766990291262135922330097087378640776699029126
21359223300970873786407766990291262135922330097087378640776699029126213592233009708737864077669902912
Миниатюры
Перевод обыкновенной дроби в десятичную (в т.ч. периодическую)  
Байт
 Аватар для Байт
13951 / 8782 / 1221
Регистрация: 24.12.2010
Сообщений: 15,891
08.09.2012, 10:52     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #19
В коде, на который сослался Day - ошибка. Для знаменателя > 10 не учтено, что первые нули не входят в период. Вот исправленный вариант.
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
#include <stdio.h>
#include <alloc.h>
Drob(int NN, int M)
{
  long N = NN;   // исходное значение нам еще понадобится
  int c, i, step, period, dop, flag, fnol;
  int *x;
 
  printf(" %d / %d =\n", NN, M);
  x = (int *)malloc(M * sizeof(int));
  for(i=0; i<M; i++) x[i] = 0;
  fnol = step = 1;
  printf("0.");
  while(1) {
    N *= 10;
    c = N / M;
    if (c==0 && fnol) {
      printf("0");
      NN = N;
      continue;
    }
    fnol = 0;
    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++;
  }
      // Теперь число печатаем
  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 числитель знаменатель
Работает для не очень больших чисел (чтоб можно было выделить память для int *x)

Добавлено через 1 минуту
Источник Перевести простую пробь в десятичную
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2014, 17:54     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую)
Еще ссылки по теме:

C++ Перевод из 6-ричной системы в десятичную
Составить программу печати n-го элемента в виде обыкновенной несократимой дроби C++
Перевод правильной дроби в десятичную C++

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

Или воспользуйтесь поиском по форуму:
alexnadj
Сообщений: n/a
09.05.2014, 17:54     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую) #20
По определению "Любая обыкновенная дробь m/n можно представить в виде конечной или бесконечной периодической дроби, и только бесконечной периодической дробью и не когда бесконечной непериодической дробью (иначе тогда иррациональные число можно было представить в виде рациональной дроби m/n, а это невозможно по определению).
А 1/103=0,(0097087378640776699029126213592233) - чистая периодическая дробь).
Yandex
Объявления
09.05.2014, 17:54     Перевод обыкновенной дроби в десятичную (в т.ч. периодическую)
Ответ Создать тему
Опции темы

Текущее время: 03:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru