洛谷 P1458 [USACO2.1]顺序的分数 Ordered Fractions

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1458 [USACO2.1]顺序的分数 Ordered Fractions相关的知识,希望对你有一定的参考价值。

题目描述

输入一个自然数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

 

【分析】

先找出所有符合条件的分数再按大小排序。

 

【代码】

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 struct node {
 5     int fz, fm;
 6     double t;
 7 }f[10000];
 8 bool cmp(node a, node b) {
 9     return a.t<b.t;
10 }
11 
12 int gcd(int m, int n) {
13     if (!n)
14         return m;
15     return gcd(n, m%n);
16 }
17 
18 int n, sum;
19 
20 int main() {
21     cin >> n;
22     for (int i=1;i<=n;++i)
23         for (int j=0;j<=i;++j)
24             if (gcd(i, j)==1)
25                 f[++sum].fz=j, f[sum].fm=i, f[sum].t=double(j)/double(i);
26     sort(f+1, f+sum+1, cmp);
27     for (int i=1;i<=sum;++i)
28         printf("%d/%d\n", f[i].fz, f[i].fm);
29 }

 

以上是关于洛谷 P1458 [USACO2.1]顺序的分数 Ordered Fractions的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1458 顺序的分数 Ordered Fractions

洛谷P1460 [USACO2.1]健康的荷斯坦奶牛 Healthy Holsteins

洛谷OJ 1074 靶型sudoku dfs(搜索顺序优化)

洛谷P1298 最接近的分数

洛谷 P1572 计算分数

洛谷 P1068 分数线划定结构体排序