Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 10.06.2014
Сообщений: 13
1

Вывод в порядке возрастания всех правильных несократимых дробей, знаменатели которых не превосходят n

10.06.2014, 20:24. Показов 2633. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
требуется написать программу, которая выводит в порядке возрастания все правильные несократимые дроби, знаменатели которых не превосходят n(2<=n<=500);
решить задачу лабораторной работы по теме «Процедуры и функции» , включив требуемые процедуры и функции в состав модуля Unit.
объясните по-подробнее пожалуйста, очень срочно надо!
заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2014, 20:24
Ответы с готовыми решениями:

Вычисление суммы несократимых дробей, заключенных в интервале (0, 1), знаменатели которых не превосходят P
//Вычисление суммы несократимых дробей, заключенных в интервале (0, 1), знаменатели которых не...

Вычисление суммы несократимых дробей, заключенных в интервале (0, 1), знаменатели которых не превосходят P
Составьте программу вычисления суммы несократимых дробей, заключенных в интервале (0, 1),...

Вычисление суммы несократимых дробей, заключенных в интервале (0, 1), знаменатели которых не превосходят P(Pascal->Java)
Вычисление суммы несократимых дробей, заключенных в интервале (0, 1), знаменатели которых не...

Напишите программу поиска всех простых несократимых дробей, заключенных между 0 и 1, знаменатели которых не превышают 7
Очень долго думал. Задачка жесть): Напишите программу поиска всех простых несократимых дробей,...

3
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
20.06.2014, 09:37 2
Модуль nums.pas:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
unit nums;
interface
 
type
  TFraction = record
    n, d: integer;
  end;
 
function GCD(a, b: integer): integer; { наибольший общий делитель }
procedure SwapReal(var a, b: Real);
procedure SwapFrac(var a, b: TFraction);
 
implementation
function GCD(a, b: integer): integer;
begin
  while (a<>0) and (b<>0) do
    if a>=b then a:=a mod b else b:=b mod a;
  GCD:=a+b;
end;
 
procedure SwapFrac(var a, b: TFraction);
var t: TFraction;
begin
  t:=a; a:=b; b:=t;
end;
 
procedure SwapReal(var a, b: Real);
var t: Real;
begin
  t:=a; a:=b; b:=t;
end;
 
end.
Программа:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
uses nums;
var
  a: array [0..10578] of TFraction;
  va: array [0..10578] of Real;
  la, i, j, k: integer;
begin
  la:=0;
  for j:=2 to 500 do
    for i:=1 to j-1 do
      if GCD(i,j)=1 then begin
        k:=la; inc(la);
        a[k].n:=i; a[k].d:=j; va[k]:=i/j;
        while (k>0) and (va[k]<va[k-1]) do begin
          SwapFrac(a[k-1],a[k]);
          SwapReal(va[k-1],va[k]);
          dec(k);
        end;
      end;
  for k:=0 to la-1 do with a[k] do WriteLn(n,'/',d);
  WriteLn('Всего: ',la);
end.
Добавлено через 7 минут
Для подсчета количества подходящих дробей можно использовать:
Pascal
1
2
3
4
5
6
7
8
9
10
uses nums;
var
  la, i, j: integer;
begin
  la:=0;
  for j:=2 to 500 do
    for i:=1 to j-1 do
      if GCD(i,j)=1 then inc(la);
  WriteLn('Всего: ',la);
end.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
21.06.2014, 03:41 3
Я бы сделал через ряд Фарея:
UFarey.pas
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
unit UFarey;
 
interface
 
procedure Farey(ltP, ltQ, rgP, rgQ : integer);
 
var
  n : integer;
 
implementation
 
{ P / Q }
procedure Farey(ltP, ltQ, rgP, rgQ : integer);
var P, Q : integer;
begin
  if (ltQ <= n) and (rgQ <= n) then
  begin
    P := ltP + rgP;
    Q := ltQ + rgQ;
    Farey(ltP, ltQ, P, Q);
    if Q <= n then
      writeln(P, '/', Q);
    Farey(P, Q, rgP, rgQ);
  end;
end;
 
end.
main.pas
Pascal
1
2
3
4
5
6
uses UFarey;
 
begin
  write('n = '); readln(n);
  Farey(0, 1, 1, 1);
end.
при n = 500, конечно, долго печатает (ну, так и результатов немало), но справляется...
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
21.06.2014, 10:38 4
До кучи нерекурсивный вариант функции:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
unit nums;
 
interface
procedure Farey(n: integer; asc: boolean);
 
implementation
procedure Farey(n: integer; asc: boolean);
var
  a, b, c, d, ta, tb, k: LongInt;
begin
  if asc then begin
    a:=0; b:=1; c:=1; d:=n;
  end else begin
    a:=1; b:=1; c:=n-1; d:=n;
  end;
  WriteLn(a,'/',b); { 0/1 asc or 1/1 desc }
  while (asc and (c<=n)) or (not asc and (a>0)) do begin
    k:=(n+b) div d;
    ta:=a; tb:=b; a:=c; b:=d; c:=k*c-ta; d:=k*d-tb;
    WriteLn(a,'/',b);
  end;
end;
 
end.
Программа:
Pascal
1
2
3
4
uses nums;
begin
  Farey(500, true);
end.
Правда, в этом случае 2 лишних дроби 0/1 (отдельный WriteLn) и 1/1 (для универсального случая возрастание/убывание) убрать чуть сложнее, для только возрастания или только убывания -- не составит труда.

Добавлено через 18 минут
В итоге, модифицированная под задачу процедура примет следующий вид:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure Farey(n: integer; asc: boolean);
var
  a, b, c, d, ta, tb, k: LongInt;
begin
  if asc then begin
    a:=1; b:=n; c:=1; d:=n-1;
  end else begin
    a:=n-1; b:=n; c:=n-2; d:=n-1;
  end;
  while (asc and (c<=n)) or (not asc and (a>0)) do begin
    WriteLn(a,'/',b);
    k:=(n+b) div d;
    ta:=a; tb:=b; a:=c; b:=d; c:=k*c-ta; d:=k*d-tb;
  end;
end;
0
21.06.2014, 10:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2014, 10:38
Помогаю со студенческими работами здесь

Вывести в порядке возрастания все правильные несократимые дроби, знаменатели которых не превосходят N
Требуется написать программу, которая выводит в порядке возрастания все правильные несократимые...

Сколько существует правильных несократимых дробей с данным знаменателем?
Сколько существует правильных несократимых дробей со знаменателем 8! (8 факториал)?

Найти количество несократимых правильных дробей с данным знаменателем
Как ускорить данный код? #include &lt;iostream&gt; using namespace std; int prost(unsigned long long...

Вывести в порядке возрастания все правильные дроби, знаменатели которых не превышают n
Для заданного натурального значения n вывести в порядке возрастания все правильные дроби,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru