# 杭电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;
}

#### 杭电hdu1717 - 小数化分数2

2013-04-24 21:27:47

#### HDU2.1.8 小数化分数2

2015-08-08 18:13:45

#### ACM刷题之HDU————小数化分数2

2016-05-13 16:23:59

#### HDOJ 1717 小数化分数2 (数学，循环小数化分数详细讲解)

2015-12-24 22:19:38

#### C++——分数化小数

2017-10-28 00:57:40

#### 紫书第二章-----循环结构程序设计

2017-08-29 16:21:39

#### 习题2.9：分数化小数

2014-07-21 00:00:47

#### 算法竞赛入门经典（分数化小数）

2016-11-14 11:39:51

#### 《算法竞赛入门经典第二版》习题2-5分数化小数问题

2016-01-30 12:26:28

#### C语言 分数化小数

2017-01-27 13:50:09