1 条题解
-
4
做题前,让我们先分析一下:
首先,由于本题涉及分数,所以我们要用结构体存储:
#include <bits/stdc++.h> using namespace std; struct Fraction { int d , m; //d为分母,m为分子 double num;//最后需要对分数排序,所以要存储分数对应的值 }; vector<Fraction> ans;//由于数量不确定,所以要用vector.
其次,让我们再看题干:
对于一个最简分数a/b(分子和分母互质的分数),满足,
总所周知,若,那么
因此,我们可以枚举和,具体如下:
int gcd(int x , int y) { if (y == 0) return x; if (x == 0) return y;//注意这个特判 return gcd(y , x % y); }
for (int b = 1 ; b <= n ; b++) for (int a = 0 ; a <= b ; a++) if (gcd(b , a) == 1) ans.push_back((fraction){b , a , (a == 0 ? 0 : ((a * 1.0) / b))});
最后还需要对其排序,函数没法用(或许我不知道),因此我们需要自己编写排序程序,冒泡排序即可:
void fractionSort() { for (int i = 0 ; i < ans.size() ; i++) for (int j = 0 ; j < ans.size() ; j++) if (ans[i].num < ans[j].num) swap(ans[i] , ans[j]); return; }
热知识:函数可以交换结构体。
最后拼接代码!
:
#include <bits/stdc++.h> using namespace std; struct Fraction { int d , m; //d为分母,m为分子 double num;//最后需要对分数排序,所以要存储分数对应的值 }; vector<Fraction> ans;//由于数量不确定,所以要用vector. int n; int gcd(int x , int y) { if (y == 0) return x; if (x == 0) return y;//注意这个特判 return gcd(y , x % y); } void fractionSort()//冒泡排序 { for (int i = 0 ; i < ans.size() ; i++) for (int j = 0 ; j < ans.size() ; j++) if (ans[i].num < ans[j].num) swap(ans[i] , ans[j]); return; } int main() { scanf("%d" , &n); //枚举 for (int b = 1 ; b <= n ; b++) for (int a = 0 ; a <= b ; a++) if (gcd(b , a) == 1) ans.push_back((Fraction){b , a , (a == 0 ? 0 : ((a * 1.0) / b))}); fractionSort(); //输出 for (int i = 0 ; i < ans.size() ; i++) printf("%d/%d\n" , ans[i].m , ans[i].d); return 0; }
- 1
信息
- ID
- 1607
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 14
- 已通过
- 9
- 上传者