2.1.2 Ordered Fractions

直接双重循环判断最大公约数,如果为1 就保存。
用一个结构体保存值和对应数据。重载下< 即可,比较简单。
   
     
  1. /*
  2. ID: awsd1231
  3. PROG: frac1
  4. LANG: C++
  5. */
  6. #include<iostream>
  7. #include<cstdio>
  8. #include<algorithm>
  9. using namespace std;
  10. struct T {
  11. int a[3];
  12. double v;
  13. // T() {a[1] = '/';}
  14. }ans[13000];
  15. int n;
  16. int gcd(int a, int b) {
  17. if (a < b) {
  18. int t = a; a = b; b = t;
  19. }
  20. if (b) return gcd(b, a % b);
  21. return a;
  22. }
  23. bool operator < (T a, T b) {
  24. return a.v < b.v;
  25. }
  26. int main () {
  27. freopen("frac1.in", "r", stdin);
  28. freopen("frac1.out", "w", stdout);
  29. scanf("%d", &n);
  30. ans[0].v = 1;
  31. ans[0].a[0] = 1;
  32. ans[0].a[2] = 1;
  33. ans[1].v = 0;
  34. ans[1].a[0] = 0;
  35. ans[1].a[2] = 1;
  36. int idx = 2;
  37. for (double i = 1; i != n + 1; ++i) {
  38. for (double j = 1; j != i; ++j) {
  39. if(!i % 2 && !j % 2) continue;
  40. if(gcd(j, i) == 1) {
  41. ans[idx].v = j/i;
  42. ans[idx].a[0] = j;
  43. ans[idx++].a[2] = i;
  44. }
  45. }
  46. }
  47. sort(ans, ans + idx);
  48. for(int i = 0; i != idx; ++i) {
  49. printf("%d/%d\n", ans[i].a[0], ans[i].a[2]);
  50. }
  51. return 0;
  52. }





你可能感兴趣的:(action)