TZOJ--3560: Ordered Fractions (枚举)
3560: Ordered Fractions
描述
Consider the set of all reduced fractions between 0 and 1 inclusive with denominators less than or equal to N.
Here is the set when N = 5:
0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
Write a program that, given an integer N between 1 and 160 inclusive, prints the fractions in order of increasing magnitude.
输入
One line with a single integer N.
输出
One fraction per line, sorted in order of magnitude.
样例输入
5
样例输出
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
题目来源
USACO
题目链接:http://tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=3560
题目大意:输出所有分母小于N,且分数值在0-1之间的所有分数
两重循环枚举以0-n为分子,1-n为分母的所有分数,然后去除重复的排序输出
我们可以考虑优化一下这个暴力,我们发现重复的 1/2 = 2/4 = 3/6,后面这些重复的都不是最简分数,所以我们只需要存在所有的最简分数,这样就不需要去重。
优化前:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct A {int z;//分子 int m;//分母 double a;//分数的值,因为数字很小,可以直接double比较是否相等
};
int gcd(int x, int y)
{if (x % y)return gcd(y , x % y);return y;
}
bool cmp(A x,A y) //按照 分数的值 进行排序从小到大输出
{return x.a<y.a;
}
A symp[12882],temp;
int main(void)
{int n,i,j,j_m,i_z,g,x;scanf("%d",&n);x=1;symp[0].a=0;for(j=1; j<=n; j++){for(i=1; i<=j; i++){//分子大于分母就大于1,可以不用遍历枚举g=gcd(j,i); j_m=j/g;i_z=i/g;symp[x].a=i_z*1.0/j_m;symp[x].z=i_z;symp[x].m=j_m;x++;}} sort(symp,symp+x,cmp);cout<<"0/1"<<endl;for(i=1; i<x; i++) {if(symp[i].a==symp[i-1].a)continue;//和前一项相等的,表示重复了,可以不用输出 elseprintf("%d/%d\n",symp[i].z,symp[i].m);}return 0;
}
优化后的代码:(我队友写的)
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct shu
{int fenzi;int fenmu;
}a[165*165];
int gcd(int x,int y)
{return y==0?x:gcd(y,x%y);
}
bool cmp(shu x,shu y)//分数通分后比较分子
{int z=gcd(x.fenmu,y.fenmu);z=x.fenmu*y.fenmu/z;return x.fenzi*(z/x.fenmu)<y.fenzi*(z/y.fenmu);
}
int main()
{int i,j,n,k;while(~scanf("%d",&n)){k=0;for(i=2;i<=n;i++){for(j=1;j<i;j++){if(gcd(i,j)!=1)continue;//判断是否是最简分数a[k].fenzi=j;a[k++].fenmu=i;}}sort(a,a+k,cmp);printf("0/1\n");for(i=0;i<k;i++){printf("%d/%d\n",a[i].fenzi,a[i].fenmu);}printf("1/1\n");// 1/1 的gcd等于1会出现多次,所以特判输出}
}
转载于:https://www.cnblogs.com/Anidlebrain/p/10081195.html
TZOJ--3560: Ordered Fractions (枚举)相关推荐
- P1458 [USACO2.1]顺序的分数 Ordered Fractions
P1458 [USACO2.1]顺序的分数 Ordered Fractions - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc++.h&g ...
- Problem 71:Ordered fractions
Problem 71:Ordered fractions 题目链接:http://static.projecteuler.net/problem=71 题目大意:将所有形如$\frac{n}{d}(d ...
- USACO 2.1.3 Ordered Fractions
USACO 2.1.3 Ordered Fractions MPS 输入一个自然数N 请写一个程序来增序输出分母小于 ...
- P1458 顺序的分数 Ordered Fractions(有技巧的枚举)+C++类封装=精简代码
题目描述 输入一个自然数N,对于一个最简分数a/b(分子和分母互质的分数),满足1<=b<=N,0<=a/b<=1,请找出所有满足条件的分数. 这有一个例子,当N=5时,所有解 ...
- 1852. Ordered Fractions
单点时限: 2.0 sec 内存限制: 256 MB Consider the set of all reduced fractions between 0 and 1 inclusive with ...
- usaco Ordered Fractions 顺序的分数(两种解法)
这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...
- 顺序的分数 Ordered Fractions
题目描述 输入一个自然数N,对于一个最简分数a/b(分子和分母互质的分数),满足1<=b<=N,0<=a/b<=1,请找出所有满足条件的分数. 这有一个例子,当N=5时,所有解 ...
- USACO sec2.1 Ordered Fractions
首先两重 for 循环对可能取的值约分,分子分母分别存放,根据比较分数大小的方法排序,然后按顺序输出(相同的只输出一个): /* PROG : frac1 LANG : C++ */ # includ ...
- USACO-Section2.1 Ordered Fractions(简单数据处理)
2017-8-6 题目描述 按分数值递增的顺序输出所有解 解答 求出所有情况再排序即可 代码 /* ID: 18795871 PROG: frac1 LANG: C++ */ #include< ...
最新文章
- Android recipe 在代码中写布局
- 新的一年,开始新的学习旅途
- 语音控制 python_python有没有语音控制模块
- golang gorm 基本使用
- [bbk3100]第7集 - Chapter 04 - 介绍RAC中CVU工具的使用
- System.ArgumentException: 输入数组长度大于此表中的列数。
- express登录例子
- LeetCode刷题(21)
- 10以内逆向运算题_【七年级上】数学 有理数运算典型易错题分析(下)
- 为什么有人说“穷人玩股票一般都会赔”?
- android x5内核 下载地址,在Android项目中集成腾讯X5内核
- 机器学习之密度聚类(DBSCAN)
- netty权威指南 微云_Netty权威指南 第2版.pdf
- RetinaFace论文解读 --- RetinaFace: Single-stage Dense Face Localisation in the Wild
- 运用java画时钟_使用Swing绘制动态时钟
- API网关(什么是API网关、如何设计统一网关?),java面试手册升级版
- php能不能用super,supersu怎么用
- java我们一起打雪仗_我们一起打雪仗四年级作文
- 浅谈雷达在气象领域的基本应用
- 关于PyCharm比较高效率的使用技巧,学习Python的小伙伴别错过!