一、分数排序的方法(用sort)
先定义一个分数的结构体
1、
bool cmp(fs a,fs b)
{int c=1.0*a.fz/a.fm;
int d=1.0*b.fz/b.fm;
return c<d;
}
2.分式交换相乘,按照分数由小到大排序
bool cmp(fs a,fs b)
{
return a.fz*b.fm<b.fz*a.fm;
}
二、例题
P1458 [USACO2.1]顺序的分数 Ordered Fractions
#include<bits/stdc++.h>
using namespace std;
struct fs
{
int fz,fm;
}x[20000];
int gcd(int x,int y)
{
return (x%y==0)?y:gcd(y,x%y);//辗转相除法求最大公约数;
}
bool cmp(fs a,fs b)
{
return a.fz*b.fm<a.fm*b.fz;
}
int main()
{
int n,k=2;//k累计分数有多少个;
cin>>n;
x[1].fz=0;
x[1].fm=1;
x[2].fz=1;
x[2].fm=1;
for(int i=1;i<=n;i++)
{for(int j=1;j<=i-1;j++)//分子要比分母小
if(gcd(i,j)==1)//确保是最简式,这样往后在遇到与最简式结果相同的分式也不用再输出了
{
k++;
x[k].fz=j;
x[k].fm=i;
}
}
sort(x+1,x+k+1,cmp);
for(int i=1;i<=k;i++)
{
cout<<x[i].fz<<"/"<<x[i].fm<<endl;
}
}