题意是给出一个N,将所有分母小于N的非负分数排序输出。
/*
ID: modengd1
PROG: frac1
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <queue>
using namespace std;
bool vis[261][261];//判重,枚举出来之后的分数当中可能存在约分后相等的分数
int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
}
struct fra
{
//分子和分母
int num1,num2;
fra(int a,int b)//构造的同时进行约分
{
int c=gcd(a,b);
num1=a/c;
num2=b/c;
}
bool friend operator <(fra f1,fra f2)
{
return f1.num1*f2.num2>f2.num1*f1.num2;//通分比较大小,以为用的优先队列排序所以是大于号
}
};
int main()
{
freopen("frac1.in","r",stdin);
freopen("frac1.out","w",stdout);
int N;
priority_queue<fra> Q;
memset(vis,false,sizeof(vis));
scanf("%d",&N);
if(N==0)//压入0
Q.push(fra(0,0));
else
Q.push(fra(0,1));
for(int j=1;j<=N;j++)//枚举分母
{
for(int i=1;i<j;i++)//枚举分子
{
fra f=fra(i,j);
if(vis[f.num1][f.num2])//若枚举出来的约分后已经和前面某个相等,则忽略
continue;
vis[f.num1][f.num2]=true;
Q.push(f);
}
}
if(N!=0)//压入1
Q.push(fra(1,1));
while(!Q.empty())//输出
{
fra now=Q.top();
Q.pop();
cout<<now.num1<<'/'<<now.num2<<endl;
}
return 0;
}