помогите пожалуйста Задача: Найти и напечатать в порядке возрастания все простые несократимые дроби заключенные между 0 и 1, знаменатели которых не превышают 7 (дробь задается двумя натуральными числами-числителем и знаменателем). т.е. 1/2,1/3,2/3,1/4,3/4,1/5,2/5,3/5,4/5... Вот с поиском несократимых дробей постараюсь сам, а вот потом чтобы по возрастанию-нет идеи. вообщем надо циклом, но можно и массивом(если так легче будет).
Автор: Client 14.11.2007 23:57
вот сделал только вывод дробей
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 15.11.2007 1:34
Уточни что есть по возрастанию??? К примеру 2/3 > 1/2 > 1/3, если так то в каком варианте тебе нужен вывод ответа? 0.5 или 1/2
Автор: TarasBer 15.11.2007 2:00
Эту задачу оптимальнее через ряд Фарея делать
http://ru.wikipedia.org/wiki/Ряд_Фарея
Там в разделе "свойства" очень хорошо описан алгоритм построения, и там сразу всё будет по возрастанию.
Автор: Malice 15.11.2007 2:49
Цитата(TarasBer @ 14.11.2007 22:00)
Эту задачу оптимальнее через ряд Фарея делать
Жаль, что я в свое время не уделял должного внимания математике Учитывая объяснения по ссылке здесь однозначно пахнет рекурсивной процедурой буквально в 3 строчки..
Автор: Boss 15.11.2007 5:26
2Malice если не сложно кинь пример с рекурсией, а то через массив сделал, но много переменных затратил..
Автор: Client 15.11.2007 11:34
Цитата
Уточни что есть по возрастанию??? К примеру 2/3 > 1/2 > 1/3, если так то в каком варианте тебе нужен вывод ответа? 0.5 или 1/2
именно так. И вывести надо как дробь 6/7....
Цитата
Эту задачу оптимальнее через ряд Фарея делать
попробую сделать...
Автор: Malice 15.11.2007 11:58
Цитата(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 16.11.2007 11:09
Код
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 16.11.2007 14:31
Цитата(Client @ 16.11.2007 7:09)
Вот подставил и все работает) Спасибо за помощь всем
Это, конечно, неплохо, только я не понял за чем ты так по хитрому вызываешь эту процедуру. Надо просто:
clrscr; f(0,1,1,1, 1,7); readkey;
Автор: Client 16.11.2007 22:20
Спасибо за совет Процедуры и функции, а тем более рекурсию еще не проходил... но пытаюсь сам с ними разобраться
Автор: pefeUnsaste 29.06.2012 5:12
посоветуйте пожалуйста хорошую зоо клинику в москве
Автор: -Алексей- 1.10.2012 1:48
Ребят, а помогите эту же задачу решить только на с++