Практика программирования (Бейсик, Си, Паскаль)


Задачи,советы и ответы - часть 43


26/65 = 2/5.

Построить программу, которая использует заданное ограничение (п < юо) и выводит все дроби, обладающие указанным выше свойством. Тривиальные дроби типа 10/20, 10/30, ... , 20/30, ... , 80/90, ... желательно не генерировать.

Совет 1 (общий)

Очевидно, что единственным вариантом является полный перебор правильных дробей от 10/11 до 98/99, в процессе которого надо сравнивать исходную дробь с четырьмя возможными отношениями старших и младших цифр. Так как программа оперирует с вещественными числами, необходимо избегать проверок на точное совпадение. Кроме того, следует обходить деление на ноль.

Программа 2_25.bas

RЕМ Генерация неправильно сокращаемых дробей CLS

RЕМ Двойной цикл по перебору дробей от 10/11 до 98/99

FOR N=11 TO 99 FOR M=10 TO N-1

T=M/N : ' Настоящее значение дроби

Nlo=N MOD 10 : ' Младшая цифра знаменателя

Nhi=(N-Nlo)\10 : ' Старшая цифра знаменателя

Mlo=M MOD 10 : ' Младшая цифра числителя

Mhi=(M-Mlo)\10 : ' Старшая цифра числителя

IF Mlo=0 THEN GOTO 100

КЕМ Анализ различных сочетаний "зачеркиваемых" цифр

IF Nlo=Mlo AND ABS(T-Mhi/Nhi)<.001 THEN PRINT M;"/";N;"=";Mhi;"/";Nhi

END IF

IF Nlo=Mhi AND ABS(T-Mlo/Nhi)<.001 THEN

PRINT M;"/";N;"=";Mlo;"/";Nhi

END IF

IF Nlo<>0 THEN

IF Nhi=Mlo AND ABS(T-Mhi/Nlo)<.001 THEN

PRINT M;"/";N;"=";Mhi;"/";Nlo

END IF

IF Nhi=Mhi AND ABS(T-M1o/Nlo)<.001 THEN

PRINT M;"/";N;"=";Mlo;"/";Nlo

END IF

END IF

100 :

NEXT M NEXT N END

Программа 2_25.с

/* Генерация неправильно сокращаемых дробей */

#include <stdio.h>

#include <conio.h>

#include <math.h>

main() !

char n,m,n_lo,n_hi,m_lo,m_hi; float t; clrscr();

/* Двойной цикл до перебору дробей от 10/11 до 98/99 */ for(n=ll; n<100; п++) for(m=10; m<n; m++) {

t=(float)m/n; /* Настоящее значение дроби */

n_lo=n % 10; /* Младшая цифра знаменателя */




- Начало -  - Назад -  - Вперед -