# 杭电ACM1717——小数化分数2

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;

int getIndex(char *str)
{
int count = 0, i = 0;
bool flag = false;
while(str[i] != '\0')
{
if(str[i] == '.')
flag = true;
if(flag && (str[i] >= '0' && str[i] <= '9'))
count++;
i++;
}
return count;
}

int getLoop(char *str)
{
int count = 0, i = 0;
bool flag = false;
while(str[i] != '\0')
{
if(str[i] == '(')
flag = true;
if(flag && (str[i] >= '0' && str[i] <= '9'))
count++;
i++;
}
return count;
}

int check(char *str)
{
int i = 0;
while(str[i] != '\0')
{
if(str[i++] == '(')
return 0;
}
return 1;
}

int gys(int x, int y)
{
int tx = x, ty = y;
int r = tx % ty;
while(r)
{
tx = ty;
ty = r;
r = tx % ty;
}
return ty;
}

int main()
{
char ch[200];
int t;
int a, b;
cin >> t;
while(t--)
{
cin >> ch;
if(check(ch) == 0)
{
int num = getIndex(ch);
int loop = getLoop(ch);
b = (int)pow(10, num) - (int)pow(10, num - loop);
int ans1 = 0, ans2 = 0;
int i = 0;
bool flag = true;
while(ch[i] != '\0')
{
if(ch[i] == '(')
flag = false;
if(ch[i] >= '0' && ch[i] <= '9')
{
ans2 = ans2 * 10 + (ch[i] - '0');
if(flag)
ans1 = ans1 * 10 + (ch[i] - '0');
}
i++;
}
a = ans2 - ans1;
}
else
{
int num = getIndex(ch);
b = (int)pow(10, num);
a = 0;
int i = 0;
while(ch[i] != '\0')
{
if(ch[i] >= '0' && ch[i] <= '9')
{
a = a * 10 + (ch[i] - '0');
}
i++;
}
}
int yue = gys(a, b);
//	cout << a << ' ' << b << ' ' << yue << endl;
cout << a / yue << '/' << b / yue << endl;
}
return 0;
}

• 本文已收录于以下专栏：

举报原因： 您举报文章：杭电ACM1717——小数化分数2 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)