主要是首先数学方法怎么化,一开始有点晕
分为三种情况
1.不循环。 例如 0.5
则是把后面的小数部分作为分子,n位小数部分 pow(10,n)作为分母,然后求最大公约数,化简
2.循环小数,从第一位开始循环 例如 0.333333333......=0.(3)
我们发现 10*0.333333-0.33333333=3
所以9*0.33333333=3
0.33333.....=3/9=1/3
所以这种小数的化简在于,数清循环节, 分子:循环节的数 分母 :循环节的位数 个 9,
3. 不是从第一位开始循环的 例如0.345454545454......=0.3(45)
0.3(45)*1000=345.4545454545
0.345*10=3.4545454545454 //目的在于小数部分化成相同的
两式相减得,990*0.3(45)=342
0.3(45)=342/990
即 分子:345-3 ,不循环和第一个循环节部分-不循环部分
分母:990 循环节位数个9 和 不循环位数个 0 组成
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int gcd(int a,int b){
if(a%b!=0){gcd(b,a%b);}
else{return b;}
}
int main(){
int n,loci,locj,x,y,z;
string s;
cin>>n;
while(n--){
cin>>s;
loci=0,locj=0;
int d=0;
int len=s.length();
for(int i=0;i<len;i++){
if(s[i]=='('){loci=i;}
else if(s[i]==')'){locj=i;}
}
//不循环
if(loci==0&&locj==0){
double i=0;
for(int j=len-1;j>1;j--){
d+=(int)(s[j]-'0')*pow(10,i);
i++;
}
int m=pow(10,(double)len-2);
z=gcd(d,m);
x=d/z;
y=m/z;
cout<<x<<"/"<<y<<endl;
}
else{//有循环
int nz=loci-2;
int nn=locj-loci-1;
y=(pow(10,(double)nn)-1)*pow(10,(double)nz);
//算分子
int a=0,b=0; //x=b-a;
if(loci==2){
a=0;
double j=0;
for(int i=locj-1;i>loci;i--){
b+=(int)(s[i]-'0')*pow(10,j);
j++;
}
}
else{
double j=0;
for(int i=loci-1;i>1;i--){
a+=(int)(s[i]-'0')*pow(10,j);
j++;
}
j=0;
for(int i=locj-1;i>1;i--){
if(isdigit(s[i])){
b+=(int)(s[i]-'0')*pow(10,j);
j++;
}
}
}
x=abs(a-b);
z=gcd(x,y);
x=x/z;
y=y/z;
cout<<x<<"/"<<y<<endl;
}
}
}
本文介绍了一种将有限小数及循环小数转换为最简分数形式的算法,并提供了详细的步骤说明及C++实现代码。针对不同类型的循环小数(如纯循环小数和混循环小数),文章给出了具体的转换方法。
3787

被折叠的 条评论
为什么被折叠?



