|
思路:1.对于普通不包含循环体的小数(其中有无限不循环小数), 其化为分数都是让小数点后组成的数除以10的此数的位数次方,比如0.1234=1234/10000。
2.对于含有循环体的小数,将循环体单独取出,计算出位数,有几位,则分母中就包含几个9,如果小数部分非循环体部分还有数,有几个数就在分母后面加几个零。例如例子中的 0.32(692307),分母就为99999900,循环体有6位所以分母有6个9,小数部分非循环体有两位数,则分母再加两个零。分子则是由循环体减去非循环体,例如:0.32(692307),分子为32692307-32
证明:对于一个数0.32(692307)
注意不要用pow有精度问题答案可能被卡掉,最后附上代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 60;
ll gcd(ll a, ll b)
{
if (b == 0)return a;
return gcd(b, a % b);
}
ll poww(ll x,ll y)
{
ll s = 1;
for (int i = 0; i < y; i++)
s *= x;
return s;
}
int main()
{
int t;
cin >> t;
while (t--)
{
string x;
cin >> x;
int n = x.size();
int flag = 0;
ll t1, t2, t3, t4, t5,s1,s2,s3,s4,s5;
t1 = t2 = t3 = t4 = t5 = 0;
s1 = s2 = s3 = s4 = s5 = 0;
for (int i = 2; i < n; i++)
{
if (x[i] == '(' || x[i] == ')')
flag = 1;
if (flag == 0)
{
t4 = t4 * 10 + x[i] - 48;
s1++;
}
if (flag == 1 &&x[i] >= '0' &&x[i] <= '9') s2++;
if (x[i] >= '0' && x[i] <= '9')t3 = t3 * 10 + x[i] - 48;
}
if (flag == 0)
{
for (int i = 2; i < n; i++)
t1 = t1 * 10 + x[i] - 48;
t2 = poww(10, n - 2);
if (t1 > t2)t5 = gcd(t1, t2);
else t5= gcd(t2, t1);
cout << t1 / t5 << "/" << t2 / t5 << endl;
}
else
{
t1 = t3- t4;
for (int i = 0; i < s2; i++)
t2 = t2 * 10 + 9;
t2 = t2 * poww(10, s1);
if (t1 > t2)t5 = gcd(t1, t2);
else t5 = gcd(t2, t1);
cout << t1 / t5 << "/" << t2 / t5 << endl;
}
}
return 0;
}