首页 > 编程知识 正文

小数化分数的题目,小数化分数的口诀表

时间:2023-05-05 09:08:02 阅读:224650 作者:4930

如有其他思路,欢迎交流!!!
【问题描述】

任何小数都能表示成分数的形式,对于給定的小数,编写程序其化为最简分数输出,小数包括简单小数和循环小数。

【输入形式】

第一行是一个整数N,表示有多少组数据。 每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。

【输出形式】

对每一个对应的小数化成最简分数后输出,占一行

【样例输入】

3
0.(4)
0.5
0.32(692307)
【样例输出】

4/9
1/2
17/52

【思路】明白循环小数转化为分数的原理:
网页链接:https://zhidao.baidu.com/question/65769921.html

【注意】

0.01245(3)可以转化为0.1245(3)的分数*(1/10)来做,所以只需得到小数点后到一个不为0的数之间0的个数,再将循环节前去除掉小数点后到第一个不为0的数之间的0的字符串转化为整数,再按照循环小数转化为分数的操作求得分子、分母再约分即可。不要求了循环小数就忘了有限小数,两者的分数求得方法不相同。 #include<iostream>#include <cmath>using namespace std;int maxgynum(int a,int b)//用辗转相除法求最大公约数 {int c;while(1){c=a%b;if(c==0) break;a=b;b=c;}return b;}void fenshu(string a)//由小数求分数的fenshu函数 { string b="",loop="";if(a=="0") {cout<<0;return ;}int count=0,weishu=0,zeronum=0;for(unsigned int i=2;i<a.size();i++){if(a[i]==0) zeronum++; //zeronum用来计算小数点后到第一个不为0的数之间的0的个数,例:0.00305,则zeronum最终等于2 else if(a[i]!=0)//当出现第一个不为0的元素时 ,进入另一个for循环完成接下来的操作,避免类似0.00305这样的数zeornum最终等于 3的情况 {for(unsigned int j=i;j<a.size();j++){ if(a[j]!='(')//b为()循环节出现前的小数部分(去除小数点后到第一个不为0的数之间的0) { b=b+a[j]; weishu++;//b中包含整数的个数 } else { count++; j++; while(a[j]!=')') {loop=loop+a[j++];//loop为包含循环节的数字的字符串 } break; }}break;}}int bnum=0;//bnum为字符串b转化过来的整数 for(unsigned int i=0;i<b.size();i++){bnum=bnum*10+b[i]-'0';}int fenzi=bnum,fenmu=0;if(count==1)//如果是循环小数,分子分母的算法 {for(unsigned int i=0;i<loop.size();i++) {fenmu=fenmu*10+9;fenzi=fenzi*10+loop[i]-'0'; } fenzi-=bnum; if(fenzi==0) { cout<<0<<'n'; return ; } for(unsigned int i=0;i<b.size()+zeronum;i++) {fenmu=fenmu*10; }}else//如果是有限小数,分子分母的算法 {fenmu=pow(10,weishu+zeronum);}int c=maxgynum(fenmu,fenzi);fenzi/=c;fenmu/=c;cout<<fenzi<<'/'<<fenmu<<'n'; }int main(){ int n; cin>>n; string a[n]; for(int i=0;i<n;i++) { cin>>a[i]; } for(int i=0;i<n;i++) { fenshu(a[i]); }return 0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。