Description
输入一个自然数N
请写一个程序来增序输出分母小于等于N的最简真分数
Input
单独的一行 一个自然数N(1..160)
Output
每个分数单独占一行
最后一行有回车
Sample Input
5
Sample Output
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
解题思路:先读入n,用i从2到n循环,用j从1到i-1循环,如果i和j是互质关系,就把它储存进数组,然后对储存进去的分数进行排序,最后按要求输出即可。
程序:
var
a:array[0..10000,1..2] of longint;
n:longint;
procedure init;
var
f:array[1..200]of boolean;
i,j:longint;
begin
fillchar(f,sizeof(f),true);
readln(n);
for i:=2 to n do
if f[i] then
begin
j:=i*2;
while j<=n do
begin
f[j]:=false;
j:=j+i;
end;
end;
end;
procedure qsort(l,r:longint);
var
i,j:longint;
k:real;
begin
if l>=r then exit;
i:=l;
j:=r;
k:=a[(i+j) div 2,1]/a[(i+j) div 2,2];
repeat
while a[i,1]/a[i,2]
while a[j,1]/a[j,2]>k do dec(j);
if i<=j then
begin
a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
inc(i);dec(j);
end;
until i>j;
qsort(i,r);
qsort(l,j);
end;
procedure pai(x:longint);
var
i,j,k:longint;
begin
for i:=1 to x do
begin
k:=0;
for j:=1 to x-1 do
if a[j,1]/a[j,2]>a[j+1,1]/a[j+1,2] then
begin
a[0]:=a[j];a[j]:=a[j+1];a[j+1]:=a[0];
k:=1;
end;
if k=0 then exit;
end;
end;
function pd(x,y:longint):boolean;
var
i,z:longint;
begin
if x>y then z:=x
else z:=y;
for i:=2 to z do
if (x mod i=0)and(y mod i=0) then exit(false);
exit(true);
end;
procedure main;
var
i,j,ans:longint;
begin
ans:=0;
writeln('0/1');
for i:=2 to n do
for j:=1 to i-1 do
if (pd(i,j)) or (j=1) then
begin
inc(ans);
a[ans,1]:=j;
a[ans,2]:=i;
end;
pai(ans);
for i:=1 to ans do
writeln(a[i,1],'/',a[i,2]);
writeln('1/1');
end;
begin
init;
main;
end.