1. 程式人生 > >hdu1717 小數化分數

hdu1717 小數化分數

std acc ef6 -a get nbsp c++ 只有一個 con

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1717

小數化分數2

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5375 Accepted Submission(s): 2188


Problem Description Ray 在數學課上聽老師說,任何小數都能表示成分數的形式,他開始了化了起來,很快他就完成了,但他又想到一個問題,如何把一個循環小數化成分數呢?
請你寫一個程序不但可以將普通小數化成最簡分數,也可以把循環小數化成最簡分數。

Input 第一行是一個整數N,表示有多少組數據。
每組數據只有一個純小數,也就是整數部分為0。小數的位數不超過9位,循環部分用()括起來。

Output 對每一個對應的小數化成最簡分數後輸出,占一行。

Sample Input 3 0.(4) 0.5 0.32(692307)

Sample Output 4/9 1/2 17/52

Source 2007省賽集訓隊練習賽(2)

Recommend lcy

題目大意: 有限小數, 循環小數化最簡分數

解法思路:

  • 純循環小數:用循環節作分子,9999...9(循環節是幾位就有幾個9)作分母即可。

  • 混循環小數:用第二個循環節以前的小數部分所組成的數,減去不循環部分所得的差,以這個差作為分數的分子;用999...9000...0做分子(9的位數是你取用的循環節的位數,0的位數是非循環部分的位數)。

代碼實現:

技術分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int t;
 5 string s;
 6 
 7 void print(ll a, ll b)
 8 {
 9     ll gcd = __gcd(a, b);
10     a /= gcd; b /= gcd;
11 printf("%lld/%lld\n", a, b); 12 } 13 14 void solve() 15 { 16 cin >> s; 17 int p = -1, q = -1; 18 for (int i = 2; i < (int)s.size(); ++ i) { 19 if(s[i]==() p = i; 20 if(s[i]==)) q = i; 21 } 22 if(p == -1) 23 { 24 ll x = 0, y = 1; 25 for (int i = 2; i < (int)s.size(); ++ i) x=x*10+s[i]-0, y*=10; 26 print(x, y); 27 } 28 else if (p == 2) 29 { 30 ll x = 0, y = 0; 31 for (int i = p+1; i < q; ++ i) x=x*10+s[i]-0; 32 for (int i = 1; i <= q-p-1; ++ i) y=y*10+9; 33 print(x, y); 34 } 35 else 36 { 37 ll x = 0, y = 0; 38 for (int i = 2; i < p; ++ i) x=x*10+s[i]-0; 39 y = x; 40 for (int i = p+1; i < q; ++ i) y=y*10+s[i]-0; 41 ll ans = 0; 42 for (int i = 1; i <= q-p-1; ++ i) ans=ans*10+9; 43 for (int i = 2; i < p; ++ i) ans*=10; 44 print(y-x, ans); 45 } 46 } 47 48 int main() { 49 scanf("%d", &t); 50 while(t--) { 51 solve(); 52 } 53 return 0; 54 }
View Code

hdu1717 小數化分數