USACO 2.1.2 Ordered Fractions

Translation

输入一个自然数 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
给定一个自然数 N1<=n<=160,请编程按分数值递增的顺序输出所有解。
注:①0 和任意自然数的最大公约数就是那个自然数②互质指最大公约数等于 1 的两个自然数。

PROGRAM NAME: frac1
INPUT FORMAT:(file frac1.in)
单独的一行 一个自然数 N(1..160)
OUTPUT FORMAT:(file frac1.out)

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

Solution

纯粹为了题解完整性233

Code

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=160+10;
int a[maxn*maxn],b[maxn*maxn];
double c[maxn*maxn];
int gcd(int m,int n){
	if(n==0)return m;
	return gcd(n,m%n);
}
void qsort(int l,int r){
	int mid=(l+r)/2;
	int i=l,j=r,i_tmp;
	double d_tmp,t=c[mid];
	while(i<=j){
		while(c[i]<t)i++;
		while(c[j]>t)j--;
		if(i<=j){
			d_tmp=c[i];c[i]=c[j];c[j]=d_tmp;
			i_tmp=a[i];a[i]=a[j];a[j]=i_tmp;
			i_tmp=b[i];b[i]=b[j];b[j]=i_tmp;
			i++;j--;
		}
	}
	if(i<r)qsort(i,r);
	if(j>l)qsort(l,j);
}
int main(){
	int i,j,k,m,n;
	freopen("frac1.in","r",stdin);
	freopen("frac1.out","w",stdout);
	scanf("%d",&n);
	int l=0;
	puts("0/1");
	for(i=1;i<=n;i++)
		for(j=i;j<=n;j++)
			if(gcd(j,i)==1){
				a[++l]=i;b[l]=j;c[l]=i*1.0/j;
			}
	qsort(1,l);
	for(i=1;i<=l;i++)printf("%d/%d\n",a[i],b[i]);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值