Problem:
给定一个n,将[0,1]的所有最简分数从小到大排序,满足分母不大于n
思路:枚举出所有可能的分子分母(两层for,或者全排列算法),判断是否为最简,之后将满足题意的数存入结构体数组中,再对结构体排序输出即可。
关键知识点:结构体排序。
//利用结构体排序 typedef struct { double st;//当前值 int x;//分子值 int y;//分母值 }sq; sq a[10001]; bool cmp(sq a1,sq a2) { return a1.st<a2.st; } sort(a,a+len,cmp);
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int N; //利用结构体排序 typedef struct { double st;//当前值 int x;//分子值 int y;//分母值 }sq; sq a[10001]; bool ju(int x,int y)//x:分子,y:分母 6/4 判断是否为最简分数 { int m=min(x,y); int flag=0; for(int i=2;i<=m;i++) { if(x%i==0&&y%i==0) flag=1; } if(flag==1) return false; else return true; } bool cmp(sq a1,sq a2) { return a1.st<a2.st; } int len=0; int main() { cin>>N; for(int i=1;i<=N;i++) { for(int j=0;j<=N;j++) { if(j==0&&i==1) { a[0].st=0;a[0].x=0;a[0].y=1; len++; } else if(ju(j,i)&&j<=i&&j!=0) { a[len].st=double(j)/i; a[len].x=j;a[len].y=i; len++; } } } sort(a,a+len,cmp); for(int i=0;i<len;i++) { cout<<a[i].x<<'/'<<a[i].y<<endl; } return 0; }