Физико-математический лицей №30
Программирование
Примеры программ на Си
 

9. Найти период правильной дроби.

< Предыдущая ^ Назад к списку задач Следующая >
/* FILENAME : task_1_9.c */
/* Eugene V. Ogurtsov */
/* Last update : 25.05.2000 */
/* Найти период правильной дроби. */
/* Написать программу, которая вводит с клавиатуры
 * два целых числа, являющихся, соответственно,
 * числителем и знаменателем правильной дроби, и выводит
 * десятичную запись этой дроби.
 * Введенные числа не превышают 32000.
 * Период числа должен быть взят в скобки.
 * Необходимо указать первое появление периода. */

#include <stdio.h>
#include <string.h>

/* Массив для учитывания встреченных остатков */
int mod[32000];

/* Основная функция */
void main( void )
{
  int M, N;
  long m, m2;

  printf("Введите числитель и знаменатель (1..32000) дроби > ");
  scanf("%i%i", &M, &N);

  /* Зануление массива остатков */
  memset(mod, 0, 64000U);

  /* Заполнение массива остатков до первого повторяющегося остатка */
  m = M % N;
  mod[(int)m] = 1;
  while (1)
  {
    m = m * 10 % N;
    if (mod[(int)m] ++)
      break;
  }

  /* Вывод целой части частного */
  printf("%i/%i=%i", M, N, M / N);
  m2 = M % N;
  /* Если число не делится нацело */
  if (m2)
    printf(".");
  /* Вывод цифр до начала периода */
  while (m2 != m)
  {
    printf("%i", m2 * 10 / N);
    m2 = m2 * 10 % N;
  }
  /* Если число имеет период */
  if (m2)
  {
    printf("(");
    /* Вывод первой цифры периода */
    printf("%i", m2 * 10 / N);
    m2 = m2 * 10 % N;
    /* Вывод остальных цифр периода */
    while (m2 != m)
    {
      printf("%i", m2 * 10 / N);
      m2 = m2 * 10 % N;
    }
    printf(")\n");
  }
  else
    printf("\n");
} /* End of 'main' function */

/* End of 'task_1_9.c' file */
Файл в кодировке MS-DOS
27 ноября 2003 года   Огурцов Е.В.