计蒜客合法分数的组合
Posted zzzyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计蒜客合法分数的组合相关的知识,希望对你有一定的参考价值。
输入一个自然数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
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
struct fra
{
float nu;
float de;
};
fra N[100000];
bool judge(int m,int n)
{
int t=1;
while(1)
{
t=n%m;
if(t==0)break;
n=m;
m=t;
}
if(m>1) return false;
else return true;
}
int main()
{
float t,s;
int n;
fra temp;
while(cin>>n)
{
int k=0;
for(int i=2;i<n+1;i++)
{
for(int j=n;j>=i;j--)
{
if(i==2||judge(i-1,j))
{
N[k].de=j;
N[k].nu=i-1;
k++;
}
}
}
for(int i=0;i<k;i++)
{
for(int j=i+1;j<k;j++)
{
s=N[i].nu/N[i].de;
t=N[j].nu/N[j].de;
if(t<s)
{
temp=N[j];
N[j]=N[i];
N[i]=temp;
}
}
}
cout<<0<<"/"<<1<<endl;
for(int i=0;i<k;i++)
cout<<N[i].nu<<"/"<<N[i].de<<endl;
cout<<1<<"/"<<1<<endl;
}
}
以上是关于计蒜客合法分数的组合的主要内容,如果未能解决你的问题,请参考以下文章