这个就是纯粹的数学问题啊,废了半天劲!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
思路:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <algorithm>
#include <iomanip>
#include <map>
#include <queue>
#include <vector>
#include <set>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long ll;
using namespace std;
ll gcd(ll a, ll b)
{
return b == 0 ? a : gcd(b, a % b);
}
int main()
{
string s; cin >> s;
int n = s.size();
int flag = 1;
for (int i = 0; i < n; i++)
{
if (s[i]=='(')
{
if (s[i - 1] == '.')//纯循环小数
{
flag = 2;
}
else flag = 3;
break;
}
}
if (flag == 1)//纯小数
{
ll ans=0;
ll sum = 1; int sign = 0;
for (int i = 0; i < n; i++)
{
if (s[i] != '.')
{
ans = ans * 10 + s[i] - '0';
}
else sign = 1;
if (sign==1)
sum=sum*10;
}
sum /= 10;
ll h = gcd(sum, ans);
cout << ans / h << "/" << sum / h << endl;
}
else if (flag == 2)//纯循环小数
{
int z = 0; int sign = 0;
ll xiao = 0; int gg = 0;
ll n9 = 0;
for (int i = 0; i < n; i++)
{
if (s[i] == '.')
sign = 1;
if (sign == 0)
z = z * 10 + s[i] - '0';
if (sign == 1)
{
gg = 1;
for (int j = i + 1; j < n; j++)
{
if (s[j]!= '('&&s[j] != ')')
{
n9 = n9 * 10 + 9;
xiao =xiao*10+s[j]-'0';
}
}
}
if (gg == 1) break;
}
ll h = gcd(z*n9+xiao, n9);
cout << (z*n9+xiao) / h << "/" << n9 / h << endl;
}
else if (flag == 3)
{
int sign1 = 0, sign2 = 0,sign3=0;
int z = 0; ll a = 0, b = 0; ll n9 = 0;
int uu = 0;
for (int i = 0; i < n; i++)
{
if (s[i] == '(')
{
sign3 = 1; b = a;
}
if (s[i] == '.')
{
sign1 = 1; sign2 = 1;
}
if (sign1 ==0)
z = z * 10 + s[i] - '0';
if (sign2 == 1 && sign3 !=1&&s[i]!='.')//小数点以后 括号之前
{
a = a * 10 + s[i] - '0'; uu++;
}
if (sign3 == 1&&s[i]!='('&&s[i]!=')')
{
b = b * 10 + s[i] - '0';
n9 = n9 * 10 + 9;
}
}
for (int i = 1; i <= uu; i++)
n9 = n9 * 10;
ll q = (b - a) + z * n9;
ll h = gcd(q, n9);
cout << q / h << "/" << n9 / h << endl;
}
}