小数化分数2 time limit :1000/1000 ms (Java/others )内存限制336032768/32768 k (Java/others ) )。
totalsubmission(s ) : 3923Accepted Submission(s ) :1592 problemdescriptiondldpd在数学课上听老师说,任何小数都表示成分数的形式
请写一个程序,不仅让普通小数成为最简单的分数,而且让循环小数成为最简单的分数。
Input的第一行是整数n,表示数据集的数目。
每组数据只有一个纯小数。 也就是说,整数部分为0。 小数位数不超过9位,循环部分用()括起来。
Output按对应的小数转换为最简单的分数并输出,占1行。 示例输入30.(4)0.50.32 ) 692307 )示例输出4/91/217/52
这个问题主要要考虑无限小数部分,无限小数分为无限循环小数和无限非循环小数。 无限不循环小数不能是分数。 主题
中给出的无限小数都是无限循环小数。 基本的想法是,通过将小数扩大到倍数,使放大后的小数和放大前的小数部分相同,从而生成两个小数
差距可以得出答案。
eg:8(520 ) )。
0.8(520 ) 10=8. (520 ) 1
0.8(520 ) 10000=8520.(520 ) 2
2-1得0.8(520 ) * 9990=8512然后得到答案。 ()~ (kalili招新时说的() ) ) )。
交流电源线:
# include ' iostream ' # include ' cstdio ' # include ' cstring ' # include ' algorithm ' usingnamespacestd; 常数上限=20; char s[MAXN]; int fz,fm; intgcd(intx,int y ) {return y==0? x:gcd(y,x % y ); }void work () {int t1=1,t2,I,k; fz=0; for(I=2; s[i] s[i]!=' (); I ) {fz=fz * 10 s[i] - '0'; t1 *=10; }fm=fz; t2=t1; if(s[I]!=' ' ) {k=gcd(T1,fz ); fz /=k; 调频fm=t1/k; 返回; (for ) I; s[i]!=() ); I ) {fm=fm * 10 s[i] - '0'; t2 *=10; }fz=fm - fz; 调频fm=t2 - t1; k=gcd(FZ,fm ); fz /=k; 调频fm /=k; }intmain(intargc,char const *argv[] ) {int t; 扫描(' % d ',t ); while(t-- ) Scanf ) ' %s ',s ); 工作(; printf('%d/%d(n ),fz,fm ); }返回0; }