Translation
输入一个自然数 N,对于一个最简分数 a/b(分子和分母互质的分数),满足 1<=b<=N,0<=a/b<=1,请找出所有满足条件
的分数。
这有一个例子,当 N=5 时,所有解为:
0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
给定一个自然数 N,1<=n<=160,请编程按分数值递增的顺序输出所有解。
注:①0 和任意自然数的最大公约数就是那个自然数②互质指最大公约数等于 1 的两个自然数。
INPUT FORMAT:(file frac1.in)
单独的一行 一个自然数 N(1..160)
OUTPUT FORMAT:(file frac1.out)
每个分数单独占一行,按照大小次序排列
Solution
纯粹为了题解完整性233
Code
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=160+10;
int a[maxn*maxn],b[maxn*maxn];
double c[maxn*maxn];
int gcd(int m,int n){
if(n==0)return m;
return gcd(n,m%n);
}
void qsort(int l,int r){
int mid=(l+r)/2;
int i=l,j=r,i_tmp;
double d_tmp,t=c[mid];
while(i<=j){
while(c[i]<t)i++;
while(c[j]>t)j--;
if(i<=j){
d_tmp=c[i];c[i]=c[j];c[j]=d_tmp;
i_tmp=a[i];a[i]=a[j];a[j]=i_tmp;
i_tmp=b[i];b[i]=b[j];b[j]=i_tmp;
i++;j--;
}
}
if(i<r)qsort(i,r);
if(j>l)qsort(l,j);
}
int main(){
int i,j,k,m,n;
freopen("frac1.in","r",stdin);
freopen("frac1.out","w",stdout);
scanf("%d",&n);
int l=0;
puts("0/1");
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
if(gcd(j,i)==1){
a[++l]=i;b[l]=j;c[l]=i*1.0/j;
}
qsort(1,l);
for(i=1;i<=l;i++)printf("%d/%d\n",a[i],b[i]);
return 0;
}