标签:
题意是给出一个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; }
标签:
原文地址:http://www.cnblogs.com/modengdubai/p/4776996.html