顺序的分数
题目描述
输入一个自然数N,对于一个最简分数a/b(分子和分母互质的分数),满足1<=b<=N,0<=a/b<=1,请找出所有满足条件的分数。
这有一个例子,当N=5时,所有解为:
0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
给定一个自然数N,1<=n<=160,请编程按分数值递增的顺序输出所有解。
注:①0和任意自然数的最大公约数就是那个自然数②互质指最大公约数等于1的两个自然数。
分析:枚举a,b,符合条件的就把a,b,a/b存下来,最后按a/b排序。
时间复杂度:O(n^2)
代码
const
maxn=100000;
var
a,b:array[0..maxn] of longint;
c:array[0..maxn] of real;
i,j,n,p:longint;
function check(x,y:longint):boolean;
var
i:longint;
begin
check:=true;
for i:=2 to x div 2 do
if (x mod i=0) and (y mod i=0) then exit(false);
end;
procedure qsort(l,r:longint);
var
i,j:longint;
k:real;
begin
if l>=r then exit;
i:=l; j:=r;
k:=c[(l+r) div 2];
repeat
while c[i]<k do inc(i);
while c[j]>k do dec(j);
if i<=j then
begin
c[0]:=c[i];c[i]:=c[j];c[j]:=c[0];
a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
b[0]:=b[i];b[i]:=b[j];b[j]:=b[0];
inc(i);dec(j);
end;
until i>j;
qsort(l,j);qsort(i,r);
end;
begin
readln(n);
for i:=1 to n do
for j:=1 to i-1 do
if ((odd(i)) or (odd(j))) and (check(i,j)) then
begin
inc(p);
a[p]:=j;
b[p]:=i;
c[p]:=j/i;
end;
qsort(1,p);
writeln('0/1');
for i:=1 to p do
writeln(a[i],'/',b[i]);
writeln('1/1');
end.