洛谷P1530 分數化小數 Fractions to Decimals
阿新 • • 發佈:2019-01-30
play 位置 pre 格式 end 循環 轉化 ... cde
題目描述
寫一個程序,輸入一個形如N/D的分數(N是分子,D是分母),輸出它的小數形式。 如果小數有循環節的話,把循環節放在一對圓括號中。
例如, 1/3 =0.33333333寫成0.(3), 41/333 = 0.123123123...寫成0.(123), 用xxx.0 等表示整數。 典型的轉化例子:
1/3 = 0.(3)
22/5 = 4.4
1/7 = 0.(142857)
2/2 = 1.0
3/8 = 0.375
45/56 = 0.803(571428)
PROGRAM NAME fracdec
輸入輸出格式
輸入格式:單獨的一行包括被空格分開的N和D(1 <= N,D <= 100000)。
輸出格式:按照上面規則計算出的小數表達式.如果結果長度大於76,每行輸出76個字符.
輸入輸出樣例
輸入樣例#1: 復制45 56輸出樣例#1: 復制
0.803(571428)
說明
翻譯來自NOCOW
USACO 2.4
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
思路是模擬除法豎式,當有余數與之前的相同時,之前余數作為被除數算出的商的位置直到算出這個余數的商的位置就是這個小數的循環節。最後不要忘記76個字符換一行,包括整數部分、括號和小數點。
1 #include<iostream> 2 using namespace std; 3 string st; 4 int n,d,t,ys[100001],f=999999999,s,tt; 5 int main() 6 { 7 cin>>n>>d; 8 t=n/d; 9 while(1) 10 { 11 st=(char)(t%10+‘0‘)+st; 12 t/=10; 13 if(!t) 14 break; 15 } 16 st+=‘代碼.‘; 17 n%=d; 18 while(1) 19 { 20 if(ys[n]) 21 { 22 f=ys[n]; 23 break; 24 } 25 else 26 ys[n]=st.length(); 27 n*=10,t=n/d; 28 st+=t+‘0‘; 29 n%=d; 30 if(!n) 31 break; 32 } 33 if(f!=999999999) 34 st+=‘)‘; 35 for(int i=0;i<st.length();i++) 36 { 37 if(i==f&&!tt) 38 i--,tt=1,cout<<‘(‘; 39 else 40 cout<<st[i]; 41 s++; 42 if(s%76==0) 43 cout<<endl; 44 } 45 return 0; 46 }
洛谷P1530 分數化小數 Fractions to Decimals