自己写了个代码,不知道对不对
输入格式 2.33333 1
1表示小数点后1位到小数结束为循环节
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll Pow(ll a, ll b){
ll s = 1;
while (b > 0)
{
if (b % 2 == 1)
s = s * a;
a = a * a;
b = b >> 1;
}
return s;
}
char a[100];
int main()
{
ll x,p;
scanf("%lld%s%lld",&x,a,&p);
ll d=Pow(10,strlen(a)-p)-1;
d=d*Pow(10,p-1);
ll c = 0;
for(ll i=p;i<strlen(a);i++)
c=c*10+a[i]-'0';
//printf("%lld/%lld\n",c,d);
ll gcd = __gcd(c,d);
c/=gcd,d/=gcd;
//printf("%lld/%lld\n",c,d);
//printf("%.9lf\n",(double)c/d);
c+=d*x;
gcd = __gcd(c,d);
c/=gcd,d/=gcd;
ll e=0,f=Pow(10,p-1);
for(ll i=1;i<p;i++)
e=e*10+a[i]-'0';
if(!e)
{
printf("%lld/%lld\n",c,d);
//printf("%.9lf\n",(double)c/d);
}
else
{
c = c*f+e*d;
d = d*f;
gcd = __gcd(c,d);
c/=gcd,d/=gcd;
printf("%lld/%lld\n",c,d);
//printf("%.9lf\n",(double)c/d);
}
return 0;
}