循環小數化分數 ①純循環小數化分數 純循環小數化分數,分子就是一個循環節的數字所組成的數,分母的各位數字都是9,9的個數等於一個循環節數字的個數,能約分的要約分。 例1: 把0.7化成分數。 0.7×10=7.777……① 0.7=0.777……② 由①—②得 0.7×9=7 所以 0.7=7/9 例2: 把5.1 2 3化成分數。 0.123×1000=123.123123……① 0.1 2 3=0.123123……② 由①—②得: . . 0.1 2 3×999=123 所以 . . 0.1 2 3=123/999 ②混循環小數化分數,第二個循環節以前的小數部分的數字所組成的數,減去小數部分中不循環部分的數字所組成的數而得到的差作分子,分母的頭幾位數字是9,末幾位數字是0,9的個數和一個循環節的位數相同,0的個數和不循環部分的位數相同。 例如: 把0.478化成分數。 0.478×1000=478.7878……① 0.478×10= 4.7878……② 由①—②得: 0.478×990=474 所以 0.478=474/990 例如: 把0.421化成分數 0.421×1000=421.11111……① 0.421×100=42.11111……② 由①—②得: 0.421×900=421—42=379所以 0.421=379/900 —————————————————————————————————————————————————————————————— 十多天沒刷題了!!!手都生了!!! 這題不是很難,主要是找到小數化成分數的技巧!!! 由於自己的粗心有一個地方的輸出的數字沒有化簡導致錯了好多次(囧)!!! 還是要努力呀!!!! ———————————————————————————————————————————————————————————————————— #include<stdio.h> #include<string.h> __int64 P(__int64 a,__int64 b) { __int64 t,r; if(a<b) { t=a;a=b;b=t; } do { r=a%b; a=b; b=r; }while(r!=0); return a; } int main() { __int64 T,len,i,flag,num1,num2,j,q,gcd,flag2,nu1,nu2,n1,n2; char str[50],str1[50],str2[50]; scanf("%I64d",&T); while(T--) { scanf("%s",str); flag=0; len=strlen(str); if(str[len-1]==')') flag=1; if(flag) { for(i=0;i<len-1;i++) if(str[i]=='(') break; q=0; for(j=i+1;j<len-1;j++) { str1[q]=str[j]; q++; } num1=0;num2=0; for(j=0;j<q;j++) num1=num1*10+(str1[j]-'0'); for(j=0;j<q;j++) num2=num2*10+9; gcd=P(num1,num2); num1/=gcd;num2/=gcd; } q=0;flag2=0; for(i=2;i<len;i++) { if(str[i]=='(') break; str2[q]=str[i]; q++; } nu1=0;nu2=1; for(i=0;i<q;i++) { nu1=nu1*10+(str2[i]-'0'); nu2=nu2*10; } if(nu1==0) { flag2=0; for(i=0;i<q;i++) num2*=10; q=0; } if(q>=1) { flag2=1; gcd=P(nu1,nu2); nu1/=gcd;nu2/=gcd; } if(flag2&&!flag) { gcd=P(nu1,nu2); nu1/=gcd;nu2/=gcd; printf("%I64d/%I64d\n",nu1,nu2); } if(flag&&!flag2) { gcd=P(num1,num2); num1/=gcd;num2/=gcd; printf("%I64d/%I64d\n",num1,num2); } if(flag&&flag2) { for(i=0;i<q;i++) num2=num2*10; n2=num2*nu2; n1=num1*nu2+nu1*num2; gcd=P(n1,n2); n1/=gcd;n2/=gcd; printf("%I64d/%I64d\n",n1,n2); } } return 0; }