题意:
给出一个无限小数和循环节,将其化成最简分式。
思路:
先有个结论是
0.456=456/999
按照这种模拟就好了。
如果说,循环节不是全部的小数位的话,先将多余的数变到小数点前,处理后再变回去。
比如0.14757575,可以先变成14.757575,最后再除以100
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll;typedef unsigned long long ull; typedef pair<ll,ll>PLL;typedef pair<int,int>PII;typedef pair<double,double>PDD; #define I_int ll inline ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;} #define read read() #define rep(i, a, b) for(int i=(a);i<=(b);++i) #define dep(i, a, b) for(int i=(a);i>=(b);--i) ll ksm(ll a,ll b,ll p){ll res=1;while(b){if(b&1)res=res*a%p;a=a*a%p;b>>=1;}return res;} const int maxn=4e5+7,maxm=1e6+7,mod=1e9+7; int main(){ string s;cin>>s; int k=read; ll sum9=0; for(int i=1;i<=k;i++) sum9=sum9*10+9; ll pos=-1,pre=0,las=0; for(int i=0;i<s.size()-k;i++){ if(s[i]=='.'){ pos=i;continue; } pre=pre*10+s[i]-'0'; } for(int i=s.size()-k;i<s.size();i++){ las=las*10+s[i]-'0'; } ll tmp=1; for(int i=pos+1;i<s.size()-k;i++) tmp=tmp*10; ll ans=sum9*pre+las; sum9=sum9*tmp; ll res=__gcd(ans,sum9); printf("%lld/%lld\n",ans/res,sum9/res); return 0; }