题目描述
写一个程序,输入一个形如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个字符.
输入输出样例
说明
翻译来自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 }