抱歉,您们的蒟蒻yxj不知道怎么插入链接qwq就只好粘个文本的了qwq:https://www.luogu.org/problemnew/show/P1458
没错,是个黄题,因为你们的小蒟蒻只会这样难度的题qwq
ok,来吧
这道题,读完题目之后,应该题意是比较容易理解的;
题意就是给出一个数,
让您求分母在这个数的范围内并且整个分数要小于等于一的所有的分数,并且还要注意输出的时候是要有顺序的。
那么我们就可以直接枚举,判断并记录。
首先我们输入之后直接来枚举两层for循环找出所有能找出来的分数
for(int i = 0; i <= n; i++) for(int j = 1; j <= n; j++) if(i <= j) {//亲爱的们,这里是一个判断条件,只要分子比分母大我们才可以选他做分数 int rom = gcd(i, j); if(rom == 1) {//其实这两个if完全可以合并到一起也就是只留第二个 head++; num[head].x = i; num[head].y = j; num[head].mal = i * 1.0 / j * 1.0; } else if(rom != 1) { head++; num[head].x = i / rom; num[head].y = j / rom; num[head].mal = (i / rom * 1.0) / (j / rom * 1.0); } }
gcd 函数判断最大公约数
int gcd(int x,int y) { return y == 0 ? x : gcd(y, x % y); }
按照分数的大小来排序
int cmp(zero x,zero y) { return x.mal < y.mal; }
最后干干净净的AC代码(个人喜好)
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int n, head; struct zero{ int x, y; double mal; }num[100000]; int gcd(int x,int y) { return y == 0 ? x : gcd(y, x % y); } int cmp(zero x,zero y) { return x.mal < y.mal; } int main() { scanf("%d",&n); for(int i = 0; i <= n; i++) for(int j = 1; j <= n; j++) if(i <= j) { int rom = gcd(i, j); if(rom == 1) { head++; num[head].x = i; num[head].y = j; num[head].mal = i * 1.0 / j * 1.0; } else if(rom != 1) { head++; num[head].x = i / rom; num[head].y = j / rom; num[head].mal = (i / rom * 1.0) / (j / rom * 1.0); } } sort(num + 1, num + 1 + head, cmp); for(int i = 1; i <= head; i++) if(num[i].mal != num[i + 1].mal) printf("%d/%d ",num[i].x, num[i].y); return 0; }
感谢收看~~~