顺序的分数 Ordered Fractions

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

题目描述

输入一个自然数 n n n,对于一个最简分数 a / b a/b a/b(分子和分母互质的分数),满足 1 ≤ b ≤ n , 0 ≤ a / b ≤ 1 1 \le b \le n,0 \le a/b \le 1 1bn,0a/b1,请找出所有满足条件的分数。

这有一个例子,当 n = 5 n=5 n=5 时,所有解为:

0 1 , 1 5 , 1 4 , 1 3 , 2 5 , 1 2 , 3 5 , 2 3 , 3 4 , 4 5 , 1 1 \frac01,\frac15,\frac14,\frac13,\frac25,\frac12,\frac35,\frac23,\frac34 ,\frac45,\frac11 10,51,41,31,52,21,53,32,43,54,11

给定一个自然数 n n n,请编程按分数值递增的顺序输出所有解。

注:
1、 0 0 0 和任意自然数的最大公约数就是那个自然数。
2、互质指最大公约数等于1的两个自然数。

输入格式

单独的一行一个自然数 n n n

输出格式

每个分数单独占一行,按照大小次序排列

样例 #1

样例输入 #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

提示

【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 160 1\le n \le 160 1n160

USACO 2.1

翻译来自NOCOW

题解:
直接采用暴力枚举的方式,__gcd是求最大公约数的函数,其返回值为最大公约数。
建立一个结构体,保存分子分母,因为要按照递增顺序输出,所以我想的是利用sort排序函数,但是因为是类类型,所以要提供排序函数,需要自己写一个cmp函数, 排完序后,就可以直接输出了。

#include<bits/stdc++.h>
using namespace std;
struct Node{
	double fz;
	double fm;
	Node(double fz1,double fm1):fz(fz1),fm(fm1){
		
	}
};

bool cmp(Node a,Node b){
	double num1=a.fz/a.fm;
	double mu2=b.fz/b.fm;
	return num1<mu2;
}
int main(){
	vector<Node> v;
	int n=0;
	cin>>n;
	for(int i=1;i<=n;++i){
		for(int j=i;j<=n;++j){
			if(__gcd(i,j)==1){
				Node node(i,j);
				v.push_back(node);
			}
		}
	}
	sort(v.begin(),v.end(),cmp);
	
	cout<<"0/1"<<endl;
	for(auto i=v.begin();i!=v.end();++i){
		cout<<i->fz<<"/"<<i->fm<<endl;
	} 
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值