1 条题解

  • 4
    @ 2023-1-14 10:58:43

    做题前,让我们先分析一下:

    首先,由于本题涉及分数,所以我们要用结构体存储:

    #include <bits/stdc++.h>
    using namespace std;
    struct Fraction
    {
        int d , m; //d为分母,m为分子
        double num;//最后需要对分数排序,所以要存储分数对应的值
    };
    vector<Fraction> ans;//由于数量不确定,所以要用vector.
    

    其次,让我们再看题干:

    对于一个最简分数a/b(分子和分母互质的分数),满足1bN1\le b\le N0ab10\le \frac{a}{b}\le 1

    总所周知,若0ab10\le \frac{a}{b} \le 1,那么bab\ge a

    因此,我们可以枚举aabb,具体如下:

    int gcd(int x , int y)
    {
        if (y == 0) return x;
        if (x == 0) return y;//注意这个特判
        return gcd(y , x % y);
    }
    
    for (int b = 1 ; b <= n ; b++)
            for (int a = 0 ; a <= b ; a++)
                if (gcd(b , a) == 1)
                    ans.push_back((fraction){b , a , (a == 0 ? 0 : ((a * 1.0) / b))});
    

    最后还需要对其排序,sortsort函数没法用(或许我不知道),因此我们需要自己编写排序程序,冒泡排序即可:

    void fractionSort()
    {
        for (int i = 0 ; i < ans.size() ; i++)
            for (int j = 0 ; j < ans.size() ; j++)
                if (ans[i].num < ans[j].num)
                    swap(ans[i] , ans[j]);
        return;
    }
    

    热知识:swapswap函数可以交换结构体。

    最后拼接代码!

    ACAC CodeCode:

    #include <bits/stdc++.h>
    using namespace std;
    struct Fraction
    {
        int d , m; //d为分母,m为分子
        double num;//最后需要对分数排序,所以要存储分数对应的值
    };
    vector<Fraction> ans;//由于数量不确定,所以要用vector.
    int n;
    
    int gcd(int x , int y)
    {
        if (y == 0) return x;
        if (x == 0) return y;//注意这个特判
        return gcd(y , x % y);
    }
    
    void fractionSort()//冒泡排序
    {
        for (int i = 0 ; i < ans.size() ; i++)
            for (int j = 0 ; j < ans.size() ; j++)
                if (ans[i].num < ans[j].num)
                    swap(ans[i] , ans[j]);
        return;
    }
    
    int main()
    {
        scanf("%d" , &n);
        //枚举
        for (int b = 1 ; b <= n ; b++)
            for (int a = 0 ; a <= b ; a++)
                if (gcd(b , a) == 1)
                    ans.push_back((Fraction){b , a , (a == 0 ? 0 : ((a * 1.0) / b))});
        fractionSort();
        //输出
        for (int i = 0 ; i < ans.size() ; i++)
            printf("%d/%d\n" , ans[i].m , ans[i].d);
        return 0;
    }
    
    • @ 2023-1-14 11:09:45

      现在题解咋不能点赞啦?!

    • @ 2024-1-11 21:21:52

      孤陋寡闻了,我当时还只是MnZn,不知道结构体排序

  • 1

信息

ID
1607
时间
1000ms
内存
256MiB
难度
8
标签
递交数
14
已通过
9
上传者