您的位置:首页 > 其它

USACO 2.1.3 Ordered Fractions

2014-11-19 16:21 267 查看
USACO 2.1.3 Ordered Fractions

MPS

输入一个自然数N 

请写一个程序来增序输出分母小于N的既约真分数

PROGRAM NAME: frac1

INPUT FORMAT

单独的一行 一个自然数N

SAMPLE INPUT (file frac1.in)


5

OUTPUT FORMAT

每个分数单独占一行

SAMPLE OUTPUT (file frac1.out)

0/1

1/5

1/4

1/3

2/5

1/2

3/5

2/3

3/4

4/5

1/1

分析:
我们发现,题目的意思就是讲分母≤n的最简分数按从小到大输出(easy~)
这里需要注意几点:
(1)不要遗漏0/1和1/1
(2)控制精度,对于无限不循环小数,不能直接除,我们用一个数学思想:
比较两个分数的大小
1 2
若---- > -----
3 5
则必有:3*2>5*1
所以排序规则就出来了
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cctype>
#include <cstring>
#include <string>
#include <cstdlib>
#include <vector>
#include <queue>
#include <deque>
using namespace std;

const int MaxN=100001;

struct frac{
int up,down;
friend bool operator< (frac a,frac b){return a.down*b.up>b.down*a.up;}//重载运算符
}c[MaxN];

int n;

int gcd(int a,int b){return b==0?a:gcd(b,a%b);}

int main(){
cin>>n;
int i,j,t=1;
for(i=1;i<=n;i++)
for(j=1;j<i;j++)
if(gcd(i,j)==1)
{
c[t].up=j;
c[t].down=i;
t++;
}
cout<<0<<"/"<<1<<endl;
sort(c+1,c+t);
for(i=1;i<t;i++)cout<<c[i].up<<"/"<<c[i].down<<endl;
cout<<1<<"/"<<1<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: