計蒜客合法分數的組合
阿新 • • 發佈:2018-11-15
輸入一個自然數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;
}
}