【問題描述】
?????? 任何小數都能表示成分數的形式,對于給定的小數,編寫程序其化為最簡分數輸出,小數包括簡單小數和循環小數。
【輸入形式】
?????? 第一行是一個整數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;
}