①纯循环小数化分数
纯循环小数化分数,分子就是一个循环节的数字所组成的数,分母的各位数字都是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
#include
__int64 P(__int64 a,__int64 b)
{
__int64 t,r;
if(a
{
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
if(str[i]=='(')
break;
q=0;
for(j=i+1;j
{
str1[q]=str[j];
q++;
}
num1=0;num2=0;
for(j=0;j
num1=num1*10+(str1[j]-'0');for(j=0;jnum2=num2*10+9;gcd=P(num1,num2);num1/=gcd;num2/=gcd;}q=0;flag2=0;for(i=2;i {if(str[i]=='(')break;str2[q]=str[i];q++;}nu1=0;nu2=1;for(i=0;i{nu1=nu1*10+(str2[i]-'0');nu2=nu2*10;}if(nu1==0){flag2=0;for(i=0;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;inum2=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;}
评论