首先跟你一個小數 令X= 0 . s1 s2 ..sn ( y1 y2 y3..ym ) 這樣的話我們把小數點分為三個部分,分別用三種顏色標記了!
我們可以把表達式轉換成:X * 10 ^n=s1s2..sn+0.y1y2..ym; 我們用S1替換 s1s2..sn ,Y替換 0.(y1y2..yn), 然後可以把表達式寫成: X * 10^n=S1 + Y; 然後 Y=0.(y1y2..ym) 變形一下:Y * 10 ^m=y1y2..ym + Y; 在這裡我們另y1y2..ym等於S2;
宗上所述:我們得到兩個表達式 X * 10^n=S1 + Y; Y * 10^m=S2 + Y; 然後將兩個式子合並成一個用表達式,
然後就可以根據這個公式,求出分子分母的 最大公約式 然後化簡 就可以了
注意討論下不是無限循環小數的情況
代碼如下:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include <vector> #include <list> #include <deque> #include <queue> #include <iterator> #include <stack> #include <map> #include <set> #include <algorithm> #include <cctype> using namespace std; typedef long long LL; const int N=21; const LL II=1000000007; char s[N]; int gcd(int n,int m) { while(m) { int t=n%m; n=m; m=t; } return n; } int main() { int i,j,k,l,t; cin>>t; while(t--) { scanf("%s",s); int len=strlen(s); int s1=0,s2=0,i=2,j=0; int n=0,m=0; while(s[i]!='('&&i<len) { s1=s1*10+s[i]-'0'; n++; i++; } j=i+1; while(s[j]!=')'&&j<len) { s2=s2*10+s[j]-'0'; m++; j++; } int fenzi=(int)(s2+(pow(10.0,m)-1)*s1); int fenmu=(int)(pow(10.0,n)*(pow(10.0,m)-1)); if(m==0) {//這個地方注意不是無限循環的小數 fenzi=s1; fenmu=(int)pow(10.0,n); } int temp=gcd(fenzi,fenmu); printf("%d/%d\n",fenzi/temp,fenmu/temp); } return 0; } #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include <vector> #include <list> #include <deque> #include <queue> #include <iterator> #include <stack> #include <map> #include <set> #include <algorithm> #include <cctype> using namespace std; typedef long long LL; const int N=21; const LL II=1000000007; char s[N]; int gcd(int n,int m) { while(m) { int t=n%m; n=m; m=t; } return n; } int main() { int i,j,k,l,t; cin>>t; while(t--) { scanf("%s",s); int len=strlen(s); int s1=0,s2=0,i=2,j=0; int n=0,m=0; while(s[i]!='('&&i<len) { s1=s1*10+s[i]-'0'; n++; i++; } j=i+1; while(s[j]!=')'&&j<len) { s2=s2*10+s[j]-'0'; m++; j++; } int fenzi=(int)(s2+(pow(10.0,m)-1)*s1); int fenmu=(int)(pow(10.0,n)*(pow(10.0,m)-1)); if(m==0) {//這個地方注意不是無限循環的小數 fenzi=s1; fenmu=(int)pow(10.0,n); } int temp=gcd(fenzi,fenmu); printf("%d/%d\n",fenzi/temp,fenmu/temp); } return 0; }