这道题重点就在于约分和排序上。首先,约分是要找分子和分母的最大公约数。排序这道题选用插入排序,每当有一个新的分数,就往原数组中插入即可。代码如下。
#include<bits/stdc++.h>
using namespace std;
int fn=0,fcnt=2;
int fa[26000],fb[26000],fc[165][165];
int fjudge(int a,int b){
if ((fb[b]*fa[a])<(fb[a]*fa[b])){
return 1;
}
else {
return 0;
}
}
void make(int sx,int sy){
int i=0,j=0,k=0,t=0,tt=0;
int x=sx,y=sy,z=y;
while (z!=0){
z=x%y;
if (z==0){
x=sx/y;
y=sy/y;
}
else {
x=y;
y=z;
}
}
if (fc[x][y]==1||(x<=y)){
return ;
}
fc[x][y]=1;
fcnt++;
fa[fcnt]=x;
fb[fcnt]=y;
for (i=1;i<=fcnt;i++){
for (j=i-1;j>0;j--){
if (fjudge(i,j)){
break;
}
}
if (j!=i-1){
t=fa[i];
tt=fb[i];
for (k=i-1;k>j;k--){
fa[k+1]=fa[k];
fb[k+1]=fb[k];
}
fa[k+1]=t;
fb[k+1]=tt;
}
}
return ;
}
int main (){
freopen ("frac1.in","r",stdin);
freopen ("frac1.out","w",stdout);
cin>>fn;
fa[1]=1;
fb[1]=0;
fc[1][0]=1;
fa[2]=1;
fb[2]=1;
fc[1][1]=1;
for (int i=1;i<=fn;i++){
for (int j=1;j<=i;j++){
make(i,j);
}
}
for (int i=1;i<=fcnt;i++){
cout<<fb[i]<<"/"<<fa[i]<<endl;
}
return 0;
}