计蒜客 合法分数的组合

题目描述:

输入一个自然数 N,我们总可以得到一些满足“1≤b≤N,0≤a/b≤1”条件的最简分数 a/b(分子和分母互质的分数),请找出所有满足条件的分数。
比方说,当 N=5 时,所有解为:
0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
现在,你需要对于一个给定的自然数 N,1≤N≤160,请编程按分数值递增的顺序输出所有解。

注:0 和任意自然数的最大公约数就是那个自然数、互质指最大公约数等于 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

思路:

  这是一道在枚举列表中的题目,有点类似暴力破解,b 从 1 到 N,然后 a 满足(分子和分母互质)的条件,将所有可能都枚举出来,接着排序,输出。

  满足(分子和分母互质)的条件:先枚举出一个 b,然后再枚举 a,用“辗转相除法”判断 a 和 b 是否满足要求,如果满足就放入相对应的数组中。

  排序:第一次遇到分数排序,没有找到思路,网上找了一些别人的代码,其实和冒泡差不多的思路。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//https://nanti.jisuanke.com/t/30
#include<iostream>
using namespace std;
int gcb(int x,int y)
{
int c;
c=x%y;
while( c!=0 )
{
x=y;
y=c;
c=x%y;
}
return y;
}

int main()
{
int N;
int a[10000]={0},b[10000]={0};
int c;
int i,j;
int k=0;
scanf("%d",&N);
for(i=2;i<=N;i++)
{
for(j=1;j<=i;j++)
{
c=gcb(i,j);
if(c==1)
{
k++;
a[k]=j;
b[k]=i;
}
}
}
//SORT
for(i=1;i<=k;i++)
{
for(j=i+1;j<=k;j++)
{
float c=a[i]*1.0/b[i];
float d=a[j]*1.0/b[j];
if(c>d)
{
int t;
t=a[j];
a[j]=a[i];
a[i]=t;

t=b[j];
b[j]=b[i];
b[i]=t;
}
}
}
cout<<"0/1"<<endl;
for(i=1;i<=k;i++)
cout<<a[i]<<"/"<<b[i]<<endl;
cout<<"1/1"<<endl;
return 0;
}
------ 本文结束------

本文标题:计蒜客 合法分数的组合

文章作者:jklf5

发布时间:2020年02月18日 - 17:02

最后更新:2020年02月19日 - 21:00

原始链接:https://jklf5.xyz/2020/02/18/计蒜客-合法分数的组合/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。