前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >P1458 顺序的分数 Ordered Fractions(有技巧的枚举)+C++类封装=精简代码

P1458 顺序的分数 Ordered Fractions(有技巧的枚举)+C++类封装=精简代码

作者头像
风骨散人Chiam
发布2020-10-28 09:40:22
5140
发布2020-10-28 09:40:22
举报
文章被收录于专栏:CSDN旧文

题目描述 输入一个自然数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的两个自然数。

输入输出格式 输入格式: 单独的一行一个自然数N(1…160)

输出格式: 每个分数单独占一行,按照大小次序排列

输入输出样例 输入样例#1: 5 输出样例#1: 0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1 说明 USACO 2.1

翻译来自NOCOW 没有什么可以说的,直接按照题目给的枚举即可,网上的代码好长,好乱,看到一个小伙计用类写的,启发了我,抛玉引砖,有一点是比较分数大小,交叉相乘。

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;
struct Fract
{
    int n,d;
    bool operator < (const Fract & tmp){return n * tmp.d < tmp.n * d;}
    void print(){  cout << n << '/' << d<<endl;}
    Fract(int a,int b):n(a),d(b){}
};
int main()
{
    int n;
    vector<Fract> res;
    res.push_back(Fract(0, 1));
    cin >> n;
    for (int i = 2; i <= n; i++)
        for (int j = 1; j < i; j++)
            if (__gcd(j, i) == 1)     res.push_back(Fract(j, i ));
    res.push_back(Fract(1, 1 ));
    sort(res.begin(),res.end());
    for (auto i=res.begin();i!=res.end();i++)    i->print();
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/06/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档