Problem 2193 So Hard
Accept: 35 Submit: 87
Time Limit: 1000 mSec Memory Limit : 32768 KBios
Problem Description數組
請將有限小數化爲最簡分數。
Inputspa
一個整數n 表示須要轉化的小數個數; 接下來n行,每行有一個有限小數。(保證小數位數不超過9位)
Output設計
輸出有n行,每行爲小數對應的最簡分數
Sample Inputcode
2
0.5
0.4
Sample Outputip
1/2
2/5
Hintstring
注意精度問題,數據保證不會有相似1.0的小數。
Sourceit
福州大學第十二屆程序設計競賽io
給你一個小數,將它轉換成最簡分數的形式。程序設計
將這個小數做爲字符數組讀進來,分別取出整數和小數部分。
在取出小數部分的時候,同時從1累乘10獲得一個值,例如0.123,則累乘獲得1000。
接下來將這個累乘獲得的數和小數部分求最大公約數,而後分別除以他們的最大公約數,獲得的值做爲分子、分母。
整數部分 * 分母 + 分子 做爲 新的分子。
最後輸出 新的分子 / 分母。
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int gcd(int n,int m) { while(n%m){ int t = n%m; n = m,m = t; } return m; } int main() { int n; scanf("%d",&n); while(n--){ char s[200]={0}; scanf("%s",s); int i; int zz = 0,zi = 0,mu = 1; for(i=0;s[i];i++){ if(s[i]=='.') break; zz = zz*10+s[i]-'0'; } for(i++;s[i];i++){ zi = zi*10+s[i]-'0'; mu*=10; } int t = gcd(zi,mu); zi/=t; mu/=t; zi+=zz*mu; printf("%d/%d\n",zi,mu); } return 0; }