nyist 334 法雷数列(一)

法雷数列(一)

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述

对任意给定的一个自然数n,将分母小于等于n的不可约的真分数按升序排列,并且在第一个分数之前加上0/1,在最后一个分 数之后加上1/1,这个序列称为n级法雷数列,以Fn表示。如F5为:0/1,1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5,1/1.

现在给出n让你求其n级法雷数列。

输入
有多组测试数据组数小于1003,
每组测试数据有一个整数n(0<n<=100).
输出
输出n级法雷数列。
样例输入
1
5
样例输出
0/1,1/1
0/1,1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5,1/1

思路: 首先预处理 进行打表,然后进行排序 最后输出分母小于n的数即可

代码:
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 
 5 #define N 3045
 6 
 7 using namespace std;
 8 
 9 typedef struct numb
10 {
11     double w;
12     int x,y;
13     numb()
14     {
15         w = 0.0;
16         x = 0;
17         y = 0;
18     }
19 }numb;
20 
21 
22 
23 numb a[N];
24 
25 bool f(numb q,numb p)
26 {
27     if(q.w - p.w < 0.000001)
28       return true;
29     else
30      return false;
31 }
32 
33 int gcd(int x,int y)
34 {
35     int d;
36 
37     while(x % y)
38     {
39        d= x;
40        x = y;
41        y = d % y;
42     }
43     return y;
44 }
45 void init()
46 {
47     int t = 0;
48     int i,j;
49     for(i = 2; i <= 100; i++)
50       for(j = 1; j <= i; j++)
51         if(gcd(i,j) == 1)
52           {
53               a[t].x =j;
54               a[t].y = i;
55               a[t].w = 1.0*j / i;
56               t++;
57           }
58 }
59 
60 int main()
61 {
62     int len = 3045;
63     init();
64     sort(a,a+len,f);
65     int n;
66     while(~scanf("%d",&n))
67     {
68         int i;
69         printf("0/1,");
70         for(i = 0; i < len; i++)
71          if(a[i].y <= n && a[i].y)
72            printf("%d/%d,",a[i].x,a[i].y);
73            printf("1/1\n");
74     }
75     return 0;
76 }

 

posted @ 2013-04-26 17:39  heity  阅读(410)  评论(0编辑  收藏  举报