USACO 2.1 顺序的分数

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,用i2n循环,用j1i-1循环,如果ij是互质关系,就把它储存进数组,然后对储存进去的分数进行排序,最后按要求输出即可。


程序:
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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值