標籤:reason \n tin return ble 輸入 狀態 記憶體 div
Best Rational Approximation時間限制: 3 Sec 記憶體限制: 128 MB
提交: 297 解決: 25
[提交][狀態][討論版][命題人:admin]題目描述Many microcontrollers have no floating point unit but do have a (reasonably) fast integer divide unit. In these cases it may pay to use rational values to approximate floating point constants. For instance,
355/113 = 3.1415929203539823008849557522124
is a quite good approximation to
π = 3.14159265358979323846
A best rational approximation, p/q, to a real number, x, with denominator at most M is a rational number, p/q (in lowest terms), with q <= M such that, for any integers, a and b with b <= M, and a and b relatively prime, p/q is at least as close to x as a/b:
|x – p/q|≤|x – a/b|
Write a program to compute the best rational approximation to a real number, x, with denominator at most M. 輸入The first line of input contains a single integer P, (1≤P≤1000), which is the number of data sets that follow. Each data set should be processed identically and independently.
Each data set consists of a single line of input. It contains the data set number, K, followed by the maximum denominator value, M (15≤M≤100000), followed by a floating-point value, x, (0≤x < 1). 輸出For each data set there is a single line of output. The single output line consists of the data set number, K, followed by a single space followed by the numerator, p, of the best rational approximation to x, followed by a forward slash (/) followed by the denominator, q, of the best rational approximation to x. 範例輸入
31 100000 .1415926535897932382 255 .1415926535897932383 15 .141592653589793238
範例輸出
1 14093/995322 16/1133 1/7
提示 來源
Greater New York Regional Contest 2017
c++ code:
#include <bits/stdc++.h>using namespace std;int main(){ int p,t,m; double x; scanf("%d",&t); while(t--) { scanf("%d%d%lf",&p,&m,&x); int a=0,b=1,c=1,d=1,e,f; while(true) { e=a+c; f=b+d; int gcd=__gcd(e,f); e/=gcd;f/=gcd; if(f>m) break; if(1.0*e/f<=x) { a=e;b=f; } else { c=e;d=f; } } printf("%d ",p); if(fabs(1.0*a/b-x)>fabs(1.0*c/d-x)) printf("%d/%d\n",c,d); else printf("%d/%d\n",a,b); } return 0;}
Best Rational Approximation( 法裡數列)