题目大意:
输入一个自然数N,对于一个最简分数a/b(分子和分母互质的分数),满足1<=b<=N,0<=a/b<=1,找出所有满足条件的分数。
思路:
利用两层循环进行枚举分子分母,当分子分母最大公约数为1时记录下来。
代码:
/* ID: lujunda1 LANG: C++ PROG: frac1 */ #include<iostream> #include<stdio.h> using namespace std; #define datasize (130+1)*130/2 struct point //利用结构体对分数的分子分母进行封装。 { int a; int b; }arry[datasize]; int gcd(int y,int x) //求最大公约数。 { return y%x?gcd(x,y%x):x; } int cmp(const void* m,const void* n) //比较函数,对point类型的分数进行大小比较。 { double a=double((*(point*)m).a)/double((*(point*)m).b); double b=double((*(point*)n).a)/double((*(point*)n).b); if(a>b) return 1; if(a==b) return 0; if(a<b) return -1; } int main() { freopen("frac1.in","r",stdin); freopen("frac1.out","w",stdout); int n; while(~scanf("%d",&n)) { int total=0; //total表示除0/1和1/1外最简分数的数量。 for(int i=1;i<=n;i++) for(int j=1;j<i;j++) if(gcd(i,j)==1) //最大公约数等于1时,说明分子分母互质。 { arry[total].a=j; arry[total++].b=i; } qsort(arry,total,sizeof(arry[0]),cmp); //排序 printf("0/1\n"); for(int i=0;i<total;i++) printf("%d/%d\n",arry[i].a,arry[i].b); printf("1/1\n"); } }