Помощь - Поиск - Пользователи - Календарь
Полная версия: дроби
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Client
помогите пожалуйста
Задача: Найти и напечатать в порядке возрастания все простые несократимые дроби заключенные между 0 и 1, знаменатели которых не превышают 7 (дробь задается двумя натуральными числами-числителем и знаменателем). т.е. 1/2,1/3,2/3,1/4,3/4,1/5,2/5,3/5,4/5...
Вот с поиском несократимых дробей постараюсь сам, а вот потом чтобы по возрастанию-нет идеи. вообщем надо циклом, но можно и массивом(если так легче будет).
Client
вот сделал только вывод дробей
uses crt;
var
i,n,m:1..7;
c:boolean;
begin
clrscr;
for i:=2 to 7 do
for n:=1 to i-1 do
begin
c:=true;
for m:=2 to i do
if (n mod m=0) and (i mod m=0) then
c:=false;
if c= true then write(' ',n,'/',i)
end;
readkey
end.

а как сделать по возрастанию?
Boss
Уточни что есть по возрастанию??? К примеру 2/3 > 1/2 > 1/3, если так то в каком варианте тебе нужен вывод ответа? 0.5 или 1/2
TarasBer
Эту задачу оптимальнее через ряд Фарея делать

http://ru.wikipedia.org/wiki/Ряд_Фарея

Там в разделе "свойства" очень хорошо описан алгоритм построения, и там сразу всё будет по возрастанию.
Malice
Цитата(TarasBer @ 14.11.2007 22:00) *

Эту задачу оптимальнее через ряд Фарея делать

good.gif
Жаль, что я в свое время не уделял должного внимания математике smile.gif Учитывая объяснения по ссылке здесь однозначно пахнет рекурсивной процедурой буквально в 3 строчки..
Boss
2Malice если не сложно кинь пример с рекурсией, а то через массив сделал, но много переменных затратил..
Client
Цитата
Уточни что есть по возрастанию??? К примеру 2/3 > 1/2 > 1/3, если так то в каком варианте тебе нужен вывод ответа? 0.5 или 1/2

именно так. И вывести надо как дробь 6/7....
Цитата
Эту задачу оптимальнее через ряд Фарея делать

попробую сделать...
Malice
Цитата(Boss @ 15.11.2007 1:26) *

2Malice если не сложно кинь пример с рекурсией, а то через массив сделал, но много переменных затратил..

Вот так примерно:
procedure f (a,b,c,d:integer; n,m:integer);
begin
if n>m then exit;
if ((a+c)<=m) and ((b+d)<=m) then
begin
f(a,b,a+c,b+d,n+1,m);
write (a+c,'/',b+d,' ');
f(a+c,b+d,c,d,n+1,m);
end;
end;

Параметры - первая граница a/b, вторая c/d (для первого вызова 0,1 и 1,1 соответственно), n - текущий порядок ряда (1 для первого вызова), m - максимальный.
Client
Код
uses crt;
var
   i,n,m:0..7;
   c:boolean;
procedure f(a,b,c,d:integer; n,m:integer);
begin
     if n>m then exit;
     if ((a+c)<=m) and ((b+d)<=m) then
        begin
             f(a,b,a+c,b+d,n+1,m);
             write (a+c,'/',b+d,'  ');
             f(a+c,b+d,c,d,n+1,m)
        end
end;
begin
     clrscr;
     for i:=1 to 7 do
              for n:=0 to i-1 do
                  begin
                       f(n,i,i,i,2,7);
                  end;
     readkey
end.

Вот подставил и все работает)
Спасибо за помощь всем
Malice
Цитата(Client @ 16.11.2007 7:09) *

Вот подставил и все работает)
Спасибо за помощь всем

Это, конечно, неплохо, только я не понял за чем ты так по хитрому вызываешь эту процедуру. Надо просто:

clrscr;
f(0,1,1,1, 1,7);
readkey;

Client
Спасибо за совет good.gif
Процедуры и функции, а тем более рекурсию еще не проходил... но пытаюсь сам с ними разобраться
pefeUnsaste
посоветуйте пожалуйста хорошую зоо клинику в москве
-Алексей-
Ребят, а помогите эту же задачу решить только на с++
TarasBer
Заменяешь begin и end на {}, = на ==, := на =.
Angelina
Что значит clrscr и readkey ???
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.