這道題是將輸入的小數(有可能是無限循環小數)來化為分數,剛開始看到以為枚舉(千萬不要嘲笑我),但是感覺不對,
所以百度了小數化為分數的方法,然後看到了各種方法,原來是這這樣,在這我采用的是小數化為分數的套公式法
純循環
用9做分母,有多少個循環數就幾個9,比如0.3,3的循環就是9分之3,0.654,654的循環就是999分之654, 0.9,9的循環就是9分之9(1),以此類推。 混循環 先來看幾個例子 例:把混循環小數0.228˙化為分數: 解:0.228˙ =[(228/1000)+8/9000)] =228/(900+100)+8/9000 =[(228/900)-(228/9000)]+(8/9000) =(228/900)+[(8/9000)-(228/9000)] =(228/900)-(22/900) =(228-22)/900 =206/900 =103/450; 例:把混循環小數0.123˙68˙化成分數: 解:0.123˙68˙=(0.12368+0.00000˙68˙) =(12368/100000)+(68/9900000) =[(12368/99000)-(12368/990000)]+(68/9900000) =(12368/99000)+[(68/9900000)-(12368/9900000)] =(12368/99000)-(12300/9900000) =(12368-123)/99000 公式 用9和0做分母,首先有幾個循環節就幾個9,接著有幾個沒加入循環的數就加幾個0,再用小數點後面的數減 沒加入循環的數,比如0.43,3的循環,有一位數沒加入循環,就在9後面加一個0做分母,再用43減4做分子,得 90分之39,0.145,5的循環就用9後面加2個0做分母,再用145減14做分子,得900分之131,0.549,49的循環,就 用99後面加1個0做分母,用549減5做分子,最後得990分之545,以此類推,能約分的要化簡。看過上面的覺得大家就知道怎麼將各種小數轉換為分數的方法了
然後就是代碼實現了,如果理解了上面的方法,其實剩下的就是字符串的處理,最後大家不要忘就是化簡得到的分數就可以了,化簡其實就是求分子和分母的最大公約數,處理後進行轉換就OK了哈!
貼一下自己的代碼哈!
#include#include using namespace std; //求最大公約數 int gcd(int a , int b) { int t; if(a < b) { t = a; a = b; b = t; } while(b > 0) { t = b; b = a%b; a = t; } return a; } int main() { #ifdef LOCAL freopen("input.txt" , "r" , stdin); #endif int T; cin >> T; string str; while(T--) { cin >> str; int primLength = 0 , lastLength = 0 , primValue = 0 , lastValue = 0; bool flag = false; int fenzi = 1 , fenmu = 1; //處理輸入的小數字符串 for(int i=2; i = '0' && str[i] <= '9') { if(flag) { lastLength++; lastValue = lastValue * 10 + (str[i] - '0'); }else{ primLength++; primValue = primValue * 10 + (str[i] - '0'); } } } //對無限循環的和不循環的分別處理 if(flag) { int temp = primValue; int sum = 0; while(lastLength--) { temp = temp * 10; sum = sum*10 + 9; } fenzi = temp + lastValue - primValue; fenmu = sum; while(primLength--) { fenmu = fenmu * 10; } //進行輸出 cout << fenzi/gcd(fenzi , fenmu) << "/" << fenmu/gcd(fenzi , fenmu) << endl; }else{ while(primLength--) { fenmu*=10; } //進行輸出 cout << primValue/gcd(fenmu , primValue) << "/" << fenmu/gcd(fenmu , primValue) << endl; } } return 0; }