这道题是将输入的小数(有可能是无限循环小数)来化为分数,刚开始看到以为枚举(千万不要嘲笑我),但是感觉不对,
所以百度了小数化为分数的方法,然后看到了各种方法,原来是这这样,在这我采用的是小数化为分数的套公式法
纯循环
看过上面的觉得大家就知道怎么将各种小数转换为分数的方法了
然后就是代码实现了,如果理解了上面的方法,其实剩下的就是字符串的处理,最后大家不要忘就是化简得到的分数就可以了,化简其实就是求分子和分母的最大公约数,处理后进行转换就OK了哈!
贴一下自己的代码哈!
#include <iostream>
#include <string>
using namespace std;
//求最大公约数
int gcd(int a , int b)
{
int t;
if(a < b)
{
t = a;
a = b;
b = t;
}
while(b > 0)
{
t = b;
b = a%b;
a = t;
}
return a;
}
int main()
{
#ifdef LOCAL
freopen("input.txt" , "r" , stdin);
#endif
int T;
cin >> T;
string str;
while(T--)
{
cin >> str;
int primLength = 0 , lastLength = 0 , primValue = 0 , lastValue = 0;
bool flag = false;
int fenzi = 1 , fenmu = 1;
//处理输入的小数字符串
for(int i=2; i<str.length(); ++i)
{
//标记遇到左括号
if(str[i] == '(')
{
flag = true;
}
//遇到数字后的处理
if(str[i] >= '0' && str[i] <= '9')
{
if(flag)
{
lastLength++;
lastValue = lastValue * 10 + (str[i] - '0');
}else{
primLength++;
primValue = primValue * 10 + (str[i] - '0');
}
}
}
//对无限循环的和不循环的分别处理
if(flag)
{
int temp = primValue;
int sum = 0;
while(lastLength--)
{
temp = temp * 10;
sum = sum*10 + 9;
}
fenzi = temp + lastValue - primValue;
fenmu = sum;
while(primLength--)
{
fenmu = fenmu * 10;
}
//进行输出
cout << fenzi/gcd(fenzi , fenmu) << "/" << fenmu/gcd(fenzi , fenmu) << endl;
}else{
while(primLength--)
{
fenmu*=10;
}
//进行输出
cout << primValue/gcd(fenmu , primValue) << "/" << fenmu/gcd(fenmu , primValue) << endl;
}
}
return 0;
}
HDU1717--小数化分数2,布布扣,bubuko.com
原文地址:http://blog.csdn.net/computer_liuyun/article/details/30575585