1. 程式人生 > >小數化為最簡分式 (hdu 1717)

小數化為最簡分式 (hdu 1717)

分析:

無限小數可按照小數部分是否迴圈分成兩類:無限迴圈小數和無限不迴圈小數。
無限不迴圈小數不能化分數;

考慮:無限迴圈小數又是如何化分數的呢?
例如:0.325656……×100=32.5656……①
0.325656……×10000=3256.56……②
用②-①即得:
0.325656……×9900=3256.5656……-32.5656……
0.325656……×9900=3256-32
所以, 0.325656……=3224/9900

程式碼:


 #include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
using namespace std;
#define LL long long
#define clr(a,b) memset(a,b,sizeof a)

char str[12];

LL  Gcd(LL a, LL b)
{
    return b==0 ? a : Gcd(b, a%b);
}
int main()
{
    #ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif // ONLINE_JUDGE int T; scanf("%d",&T); while(T--) { scanf("%s",str); int len=strlen(str); LL tot,num; tot=0; num=1; LL xx,yy; xx=0; yy=1; bool
flag=0; for(int i=1; i<len; i++){ if(str[i]>='0'&&str[i]<='9'){ tot=tot*10+(str[i]-'0'); num*=10; } if(str[i]=='(') flag=1; if(!flag&&str[i]>='0'&&str[i]<='9'){ xx=xx*10+(str[i]-'0'); yy*=10; } } if(num!=yy) num-=yy; if(tot!=xx) tot-=xx; //cout<<tot<<" "<<num<<" "<<xx<<" "<<yy<<endl; LL kk=Gcd(tot,num); //cout<<kk<<endl; cout<<tot/kk<<"/"<<num/kk<<endl; //printf("%d/%d\n",tot/kk,num/kk); } return 0; }