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 }
yy_room