1. 程式人生 > >計蒜客合法分數的組合

計蒜客合法分數的組合

輸入一個自然數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;
    }
}