计蒜客合法分数的组合

输入一个自然数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;
    }
}

猜你喜欢

转载自www.cnblogs.com/zzzyyy/p/9961573.html