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 */
|