【问题描述】
任何小数都能表示成分数的形式,对于給定的小数,编写程序其化为最简分数输出,小数包括简单小数和循环小数。
【输入形式】
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
【输出形式】
对每一个对应的小数化成最简分数后输出,占一行
【样例输入】
3 0.(4) 0.5 0.32(692307)
【样例输出】
4/9 1/2 17/52
【提示】
0.32(692307)=0.32 +0.(692307)/ 100 (*)
令 x=0.(692307), 那么 1000000x=692307+x
则 x=692307/999999,代入运算式(*)经过通分约分处理后即可得到结果。
解题:
分三种情况讨论;分数化简可用公约数进行。
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b) {
if (a%b==0) return b;
else return gcd(b,a%b);
}
int main() {
int m;
cin>>m;
while (m--) {
string s;
cin>>s;
s.erase(0,2);
if (s[0]=='(') {
int x=0,y=0;
for (int i=1;i<s.length()-1;i++) {
x+=(s[i]-'0')*pow(10,s.length()-i-2);
y+=9*pow(10,s.length()-i-2);
}
cout<<to_string(x/gcd(x,y))+'/'+to_string(y/gcd(x,y))<<endl;
continue;
}
if (s.find('(')==string::npos) {
int x=0,y=pow(10,s.length());
for (int i=0;i<s.length();i++) {
x+=(s[i]-'0')*pow(10,s.length()-i-1);
}
cout<<to_string(x/gcd(x,y))+'/'+to_string(y/gcd(x,y))<<endl;
continue;
}
int x1=0,y1=0,x2=0,y2=0;
int k=s.find('(');
y1=pow(10,k);
for (int i=0;i<k;i++){
x1+=(s[i]-'0')*pow(10,k-i-1);
}
for (int i=k+1;i<s.length()-1;i++) {
x2+=(s[i]-'0')*pow(10,s.length()-i-2);
y2+=9*pow(10,s.length()-i-2);
}
x1=(x1*y2)+x2;
y1=y1*y2;
cout<<to_string(x1/gcd(x1,y1))+'/'+to_string(y1/gcd(x1,y1))<<endl;
}
return 0;
}