计蒜客之合法分数的组合

题目描述:

输入一个自然数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;
}
posted @ 2018-03-25 10:41  让你一生残梦  阅读(380)  评论(0编辑  收藏  举报