//usaco training-Ordered Fractions /* * 题目类型:枚举 * 题意:输入一个自然数N,写一个程序来增序输出分母小于等于N的既约真分数 * 用双重循环搜索所有不同分子和分母的情况,将满足条件的分数保存起来 * 按分数的大小排序输出 */ /* Compiling... Compile: OK Executing... Test 1: TEST OK [0.000 secs, 3188 KB] Test 2: TEST OK [0.000 secs, 3188 KB] Test 3: TEST OK [0.000 secs, 3188 KB] Test 4: TEST OK [0.000 secs, 3188 KB] Test 5: TEST OK [0.000 secs, 3188 KB] Test 6: TEST OK [0.000 secs, 3188 KB] Test 7: TEST OK [0.000 secs, 3188 KB] Test 8: TEST OK [0.027 secs, 3188 KB] Test 9: TEST OK [0.081 secs, 3188 KB] Test 10: TEST OK [0.162 secs, 3188 KB] Test 11: TEST OK [0.432 secs, 3188 KB] All tests OK. */ #include <iostream> #include <algorithm> #include <fstream> using namespace std; #define MAX 10000 struct point{ int a,b; double d; }pos[MAX]; int gcd(int a,int b); int cmp(point x,point y); int main(void) { int i,j,n,k=0; ifstream fin("frac1.in"); ofstream fout("frac1.out"); fin>>n; for(i=2; i<=n; ++i) for(j=1; j<i; ++j) if(gcd(i,j)==1){ pos[k].a=i; pos[k].b=j; pos[k++].d=j*1.0/i; } sort(pos,pos+k,cmp); fout<<"0/1"<<endl; for(i=0; i!=k; ++i) fout<<pos[i].b<<'/'<<pos[i].a<<endl; fout<<"1/1"<<endl; return 0; } int gcd(int a,int b) { return (b==0) ? a : gcd(b,a%b); } int cmp(point x,point y) { return x.d<y.d; }