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.
PROGRAM NAME: frac1
INPUT FORMAT
One line with a single integer N.
SAMPLE INPUT (file frac1.in)
5
OUTPUT FORMAT
One fraction per line, sorted in order of magnitude.
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(1到160),输出 0 ~ 1 最简分数由小到大的排序分数,分母和分子构成的分数由 N 以内的数构成。
思路:
结构体保存分子和分母,同时用 num 算出分子 / 分母的得数,最后排序输出即可。构成分数过程中判断分子分母是否互质。
AC:
/*
TASK:frac1
LANG:C++
ID:sum-g1
*/
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct
{
int mol;
int den;
double num;
}no;
no node[25000];
int cmp(no a,no b)
{
return a.num < b.num;
}
int test(int mol,int den)
{
int t;
while(den % mol)
{
t = den % mol;
den = mol;
mol = t;
}
return mol;
}
int main()
{
freopen("frac1.in","r",stdin);
freopen("frac1.out","w",stdout);
int n,sum = 2;
scanf("%d",&n);
node[0].mol = 0,node[0].den = 1,node[0].num = 0;
node[1].mol = 1,node[1].den = 1,node[1].num = 1;
for(int i = 2;i <= n;i++)
for(int j = 1;j < i;j++)
{
if(test(j,i) == 1)
{
node[sum].mol = j;
node[sum].den = i;
node[sum].num = (j * 1.0) / (i * 1.0);
sum++;
}
}
sort(node,node + sum,cmp);
for(int i = 0;i < sum;i++)
printf("%d/%d\n",node[i].mol,node[i].den);
return 0;
}