这道题是将输入的小数(有可能是无限循环小数)来化为分数。刚開始看到以为枚举(千万不要嘲笑我),可是感觉不正确。

所以百度了小数化为分数的方法,然后看到了各种方法,原来是这这样,在这我採用的是小数化为分数的套公式法

纯循环

用9做分母,有多少个循环数就几个9。比方0.3,3的循环就是9分之3,0.654,654的循环就是999分之654。 0.9。9的循环就是9分之9(1)。以此类推。

混循环
先来看几个样例
例:把混循环小数0.228˙化为分数:
解:0.228˙
=[(228/1000)+8/9000)]
=228/(900+100)+8/9000
=[(228/900)-(228/9000)]+(8/9000)
=(228/900)+[(8/9000)-(228/9000)]
=(228/900)-(22/900)
=(228-22)/900
=206/900
=103/450;
例:把混循环小数0.123˙68˙化成分数:
解:0.123˙68˙=(0.12368+0.00000˙68˙)
=(12368/100000)+(68/9900000)
=[(12368/99000)-(12368/990000)]+(68/9900000)
=(12368/99000)+[(68/9900000)-(12368/9900000)]
=(12368/99000)-(12300/9900000)
=(12368-123)/99000
公式
用9和0做分母。首先有几个循环节就几个9。接着有几个没增加循环的数就加几个0,再用小数点后面的数减 没增加循环的数,比方0.43,3的循环,有一位数没增加循环。就在9后面加一个0做分母,再用43减4做分子,得 90分之39,0.145,5的循环就用9后面加2个0做分母,再用145减14做分子,得900分之131,0.549,49的循环。就 用99后面加1个0做分母。用549减5做分子。最后得990分之545。以此类推,能约分的要化简。

看过上面的认为大家就知道怎么将各种小数转换为分数的方法了

然后就是代码实现了,假设理解了上面的方法,事实上剩下的就是字符串的处理,最后大家不要忘就是化简得到的分数就能够了,化简事实上就是求分子和分母的最大公约数,处理后进行转换就OK了哈。

贴一下自己的代码哈!

#include <iostream>
#include <string>
using namespace std;
//求最大公约数
int gcd(int a , int b)
{
int t;
if(a < b)
{
t = a;
a = b;
b = t;
}
while(b > 0)
{
t = b;
b = a%b;
a = t;
}
return a;
}
int main()
{
#ifdef LOCAL
freopen("input.txt" , "r" , stdin);
#endif
int T;
cin >> T;
string str;
while(T--)
{
cin >> str;
int primLength = 0 , lastLength = 0 , primValue = 0 , lastValue = 0;
bool flag = false;
int fenzi = 1 , fenmu = 1;
//处理输入的小数字符串
for(int i=2; i<str.length(); ++i)
{
//标记遇到左括号
if(str[i] == '(')
{
flag = true;
}
//遇到数字后的处理
if(str[i] >= '0' && str[i] <= '9')
{
if(flag)
{
lastLength++;
lastValue = lastValue * 10 + (str[i] - '0');
}else{
primLength++;
primValue = primValue * 10 + (str[i] - '0');
}
}
}
//对无限循环的和不循环的分别处理
if(flag)
{
int temp = primValue;
int sum = 0;
while(lastLength--)
{
temp = temp * 10;
sum = sum*10 + 9;
}
fenzi = temp + lastValue - primValue;
fenmu = sum;
while(primLength--)
{
fenmu = fenmu * 10;
}
//进行输出
cout << fenzi/gcd(fenzi , fenmu) << "/" << fenmu/gcd(fenzi , fenmu) << endl;
}else{
while(primLength--)
{
fenmu*=10;
}
//进行输出
cout << primValue/gcd(fenmu , primValue) << "/" << fenmu/gcd(fenmu , primValue) << endl;
}
}
return 0;
}


最新文章

  1. Nexus(一)环境搭建
  2. T4学习资料
  3. Python之路-(Django进阶一)
  4. hihoCoder#1000
  5. linux服务器下添加字体
  6. 【php学习】数组操作
  7. ArcGIS Server 10.2 实战(五)spatial etl tool 格式转换服务
  8. emoji表情键盘 回退删除方法
  9. 对js运算符“||”和“&amp;&amp;”的总结
  10. jsp的验证码实现
  11. Mysql:查询每个月下的数据,根据状态或者年份的sql语句
  12. VUE项目注意点
  13. PHP 十万数字不同数组取最大的5个 (经典面试题topK) (原)
  14. html5 autoplay不起作用 Uncaught (in promise) DOMException: play() failed because the user didn&#39;t interac
  15. Effective Java 第三版——72. 赞成使用标准异常
  16. 【转载】Elasticsearch 5.x 字段折叠的使用,广度搜索
  17. 13组合模式Composite
  18. Java的Integer和int有什么区别
  19. Spartan6上软核系统自定义外设调用AXI Stream FFT经验
  20. CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析

热门文章

  1. 我们为什么在移动端项目中选择jQuery而不是Zepto
  2. C/S 中当服务器进程崩溃的时候 SIGPIPE
  3. PHP-密码学算法及其应用-散列函数
  4. jquery 入门与知识
  5. Yii::记录日志到自定义文件
  6. Spring boot配置fastjson
  7. python笔记-列表和元组
  8. SDK Manager 闪退的解决方式
  9. SeeSharpTools.JXI.DSP.Spectrum 使用
  10. windows gvim插入当前时间