小数化分数2
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4220 Accepted Submission(s): 1702
Problem Description
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
Output
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input
3 0.(4) 0.5 0.32(692307)
Sample Output
4/9 1/2 17/52
PS:这道题要找出小数划分数的规律
1.如果不是循环小数,比较简单,直接取分子为原分子,分母为10*分子位数
例如:0.5 则分子为5,分母为10*1
2.如果是纯循环小数,例如0.44444444444...
则分子为第一个循环数,分母为第一个循环数的位数的9
例如0.444444... 则第一个循环数为4,所以分子为4, 分母为9
例如0.452452452...则第一个循环数为452, 所以分子为452, 分母为999
3.如果是非纯循环小数,例如0.3256565656...
则分子为(非循环数*10^第一个循环数的位数)-非循环数, 分母为(循环数的位数的9 * 10^非循环数的位数)
例如0.32565656..... 则非循环数为32, 第一个循环数为56
所以分子为3256-32=3224, 分母为9900
最后就是把上面得到的分子分母化简
先求出分子分母的最大公约数,例如分子为5,分母为10,则他们最大公约数为5
输出结果为 (5/5)/(10/5)
即1/2
讲得不好,直接看代码:
#include<iostream>
#include<string>
using namespace std;
int gcd(int a, int b)
{
while (a ^= b ^= a ^= b %= a);
return b;
}
int main()
{
int t;
cin >> t;
while (t--)
{
string s;
cin >> s;
int len = s.length();
int a = 0, b = 0, c = 0, d = 1;
bool isq = true;
for (int i = 2; i < len; ++i)
{
if (s[i] == ')')
{
break;
}
if (s[i] != '(' && isq)
{
a *= 10;
a += (s[i] - '0');
d *= 10;
}
else if (s[i] == '(')
{
b = a;
isq = false;
}
else
{
b *= 10;
b += (s[i] - '0');
c *= 10;
c += 9;
}
}
if (isq)
{
b = a;
c = d;
}
else
{
b -= a;
c *= d;
}
int g = gcd(b, c);
cout << b / g << "/" << c / g << endl;
}
return 0;
}