#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]));
}
/**************/