现充|junyu33

题解 P6485 【[COCI2010-2011#4] PROSJEK】

我们使用 PP 来逼近 P

观察 P 的小数部分,可以得到:

P:P=(PP):(PP)

因为最多9位小数,将 (PP)(PP) 乘上1e9,对两者求gcd即可。

注意当P为整数时需要特判

担心浮点误差?使用Round即可解决问题。

#include <bits/stdc++.h>
using namespace std;
double t,rem;
long long x,y,g,lower,v[10];
int main(){
   cin>>t;
   rem=t-floor(t);//小数部分
   lower=floor(t);//整数部分(下边界)
   if(rem==0){v[lower]=1;goto kkk;}//特判
   rem*=1e9;rem=round(rem);//消除浮点误差
   x=1e9-rem;y=rem;//即比式右边两项
   g=__gcd(x,y);//求gcd
   x/=g,y/=g;
   v[lower]=x;
   v[lower+1]=y;//求出答案
   kkk:;
   for(int i=1;i<=5;i++) cout<<v[i]<<" ";
   return 0;
}