【问题描述】
任何小数都能表示成分数的形式,对于給定的小数,编写程序其化为最简分数输出,小数包括简单小数和循环小数。
【输入形式】
第一行是一个整数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;
}