题目描述:
输入一个自然数N,我们总可以得到一些满足“1≤b≤N,0≤a/b≤1”条件的最简分数a/b(分子和分母互质的分数),请找出所有满足条件的分数。
比方说,当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的两个自然数。
输入包括一个给个给定的自然数N
输出为一个列表,每个分数单独占一行,按照实际大小从小到大排列
样例输入:
5
样例输出:
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
代码如下:
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; int gcd(int a,int b) { if(a == 0) { if(b==1) return 1; return 0; } while(b) { int t = a%b; a = b; b = t; } return a; } struct node { int x; int y; double sum; } a[10005]; bool cmp(node n,node m) { return n.sum<m.sum; } int main() { int n; scanf("%d",&n); int index =0; ///隐含条件:i要大于j;i*1.0<j<=1; for(int i = 1; i<=n; i++) ///这个是分母 { for(int j = 0; j <= i; j++) ///这个表示分子 { // if(j*1.0/i>1) break; if(gcd(j,i) == 1 && j*1.0/i<=1) { a[index].x = j; a[index].y = i; a[index].sum = j*1.0/i; index ++; } } } sort(a,a+index,cmp); for(int i=0; i<index; i++) { printf("%d/%d\n",a[i].x,a[i].y); } return 0; }