Ordered Fractions顺序的分数
输入一个自然数 N
请写一个程序来增序输出分母小于等于 N 的既约真分数
PROGRAM NAME: frac1
INPUT FORMAT
单独的一行 一个自然数 N(1..160)
SAMPLE INPUT (file frac1.in)
5
OUTPUT FORMAT
每个分数单独占一行
SAMPLE OUTPUT (file frac1.out)
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
=============================
生成数后先判断是否可行..
最后再排序..
=================
{
ID:jie19952
PROG:frac1
LANG:PASCAL
}
type
re=record
s,m:longint;
v:real;
end;
var
n:longint;
ans:array[1..25600]of re;
ans_s:longint;
procedure init;
begin
assign(input,'frac1.in');
assign(output,'frac1.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
function gcd(a,b:longint):longint;
begin
if b=0 then gcd:=a
else gcd:=gcd(b,a mod b)
end;
function pd(x,y:longint):boolean;
begin
if gcd(x,y)=1 then exit(true);
exit(false);
end;
procedure qsort(s,t:longint);
var
i,j:longint;
x:real;
tem:re;
begin
x:=ans[(s+t)shr 1].v;
i:=s; j:=t;
repeat
while x<ans[j].v do dec(j);
while ans[i].v<x do inc(i);
if i<=j then
begin
tem:=ans[i];
ans[i]:=ans[j];
ans[j]:=tem;
inc(i); dec(j);
end;
until i>j;
if i<t then qsort(i,t);
if s<j then qsort(s,j);
end;
procedure main;
var
i,j:longint;
begin
readln(n);
writeln('0/1');
ans_s:=0;
for i:=1 to n-1 do
for j:=i+1 to n do
if pd(i,j) then
begin
inc(ans_s);
ans[ans_s].s:=i;
ans[ans_s].m:=j;
ans[ans_s].v:=i/j;
end;
qsort(1,ans_s);
for i:=1 to ans_s do
writeln(ans[i].s,'/',ans[i].m);
writeln('1/1');
end;
begin
init;
main;
terminate;
end.