题意:给个小数p(0<=p<1),求差值与其最小的不可约分分数且分母不能超过n。
1 #include <bits/stdc++.h>
2 using namespace std;
3 int main()
4 {
5 int p,t,m;
6 double x;
7 scanf("%d",&t);
8 while(t--)
9 {
10 scanf("%d%d%lf",&p,&m,&x);
11 int a=0,b=1,c=1,d=1,e,f;
12 while(true)
13 {
14 e=a+c;
15 f=b+d;
16 int gcd=__gcd(e,f);
17 e/=gcd;f/=gcd;
18 if(f>m) break;
19 if(1.0*e/f<=x)
20 {
21 a=e;b=f;
22 }
23 else
24 {
25 c=e;d=f;
26 }
27 }
28 printf("%d ",p);
29 if(fabs(1.0*a/b-x)>fabs(1.0*c/d-x))
30 printf("%d/%d
",c,d);
31 else
32 printf("%d/%d
",a,b);
33 }
34 return 0;
35 }
1 //暴力
2 #include <iostream>
3 #include <cstring>
4 #include <cstdio>
5 #include <vector>
6 #include <cmath>
7 #include <algorithm>
8 #include <cstdlib>
9 #include <string>
10 using namespace std;
11 int t,n,k;
12 double x;
13 int p,q,bp,bq;
14 double br,cr;
15 int main()
16 {
17 scanf("%d",&t);
18 while(t--)
19 {
20 scanf("%d %d %lf",&k,&n,&x);
21 bq=n;
22 cr=bq*x;
23 bp=ceil(cr);
24 cr=(double)bp/(double)bq;
25 br=fabs(x-cr);
26 for(int i=n-1;i>=1;i--)
27 {
28 q=i;
29 cr=q*x;
30 p=ceil(cr);//cr可能小于1,不用ceil就是p=0,后面的cr不变,就无法更新了。
31 cr=(double)p/(double)q;
32 cr=fabs(x-cr);
33 if(cr<br)
34 {
35 br=cr;
36 bp=p;
37 bq=q;
38 }
39 }
40 int gcd=__gcd(bp,bq);
41 bp/=gcd;
42 bq/=gcd;
43 printf("%d %d/%d
",k,bp,bq);
44 }
45 return 0;
46 }