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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Метод дихотомии (как метод оптимизации) http://www.cyberforum.ru/cpp-beginners/thread84831.html
Нужно написать программу решения метода дихотомии (как метод оптимизации) на С++.А я в С++ новичок, многого не знаю. Пожалуйста, помогите кто-нибудь! Буду очень благодарна!
C++ Массивы Товарисчи программисты помогите мне решить 2 задачи ....оч нужно ...=( <---грустный смайл )) Задача 1 )В одномерном массиве, состоящем из 25 вещественных элементов, вычислить: 1) минимальный элемент массива; 2) сумму элементов массива, расположенных между первым и последним положительными элементами. Преобразовать массив таким образом, чтобы сначала располагались все элементы равные... http://www.cyberforum.ru/cpp-beginners/thread84827.html
Проверка введенного числа на чётность C++
Написать программу, которая проверяет, является ли введенное пользователем целое число четным. Хэлп ми плз )
C++ Среднее геометрическое положительных членов.
Помогите пожалуйста! Дан моссив. Найти среднее геометрическое положительных членов. и вывести на экран.
C++ Отсортировать массив методом Шелла http://www.cyberforum.ru/cpp-beginners/thread84815.html
Здравствуй, помогите пожалуйста решить! Отсортировать массив, не упорядоченый ни по неубыванию, ни по невозрастанию с помощью сортировки методом Шелла.
C++ Значения трех функций. В С++ Вычислить и вывести на экран в виде таблицы значения трех функций (см. свой вариант) на интервале от хнач до хкон с шагом dx. Значения аргумента и функций хранить в двухмерном массиве. Таблицу снабдить заголовком и шапкой. Каждая строка таблицы должна содержать значение аргумента и соответствующие значения функций. y=(sqrt(x-1)+pow(x-1,1./6))/pow(x-1,1./3) 2 3 4 5 ... подробнее

Показать сообщение отдельно
Day
1154 / 959 / 57
Регистрация: 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 числитель знаменатель

Наверное, можно сделать и поизящнее, но этот вариант как-будто работает
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru