hdu1717 小數化分數
阿新 • • 發佈:2017-08-29
std acc ef6 -a get nbsp c++ 只有一個 con
請你寫一個程序不但可以將普通小數化成最簡分數,也可以把循環小數化成最簡分數。
Input
第一行是一個整數N,表示有多少組數據。
每組數據只有一個純小數,也就是整數部分為0。小數的位數不超過9位,循環部分用()括起來。
題目鏈接: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
請你寫一個程序不但可以將普通小數化成最簡分數,也可以把循環小數化成最簡分數。
每組數據只有一個純小數,也就是整數部分為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;View Code11 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 }
hdu1717 小數化分數