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

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

纯循环

用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;
}


HDU1717--小数化分数2的更多相关文章

  1. HDU1717小数化分数2

    小数化分数2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  2. ACM学习历程—HDU1717 小数化分数2(gcd)

    Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢? 请你写一个程序不但可以将普通小数 ...

  3. 【HDU】1717 小数化分数2 ——计数原理

    小数化分数2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  4. HDU 1717 小数化分数2(最大公约数)

    小数化分数2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. 紫书 习题8-14 UVa 1616(二分+小数化分数+精度)

    参考了https://www.cnblogs.com/dwtfukgv/p/5645446.html (1)直接二分答案.说实话我没有想到, 一开始以为是贪心, 以某种策略能得到最优解. 但是想了很久 ...

  6. CSU 8月月赛 Decimal 小数化分数

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1303 这个OJ很容易跪所以我贴一下题目 Description 任意一个分数都是有理数,对于任意一 ...

  7. 杭电oj1717——小数化分数(java实现)

    question:小数化分数2 思路: /** * 这道题没有整数部分(有也无所谓,算小数部分,算完了分子分母按倍数加上就好),也就是说数组直接从a[2]开始后面是小数,我把这道题分为了三类: * * ...

  8. HDU 1717 小数化分数2 数学题

    解题报告:输入一个小于1的小数,让你把这个数转化成分数,但注意,输入的数据还有无限循环的小数,循环节用一对括号包含起来. 之前还没有写过小数转分数的题,当然如果没有循环小数的话,应该比较简单,但是这题 ...

  9. 小数化分数的O(log2n)解法

    具体约束: 给定一个小数x,x满足0<=x<1,且保证给定的x保留了18位小数 输出一个分数,使得分母不超过1e9,分子分母互质,且在满足这些条件的情况下最接近x 了解一下法雷数列和ste ...

  10. hdu 1905 小数化分数2

    ;}

随机推荐

  1. ant design pro (四)新增页面

    一.概述 参看地址:https://pro.ant.design/docs/new-page-cn 这里的『页面』指配置了路由,能够通过链接直接访问的模块,要新建一个页面,通常只需要在脚手架的基础上进 ...

  2. vue2.x 总结

    1.独立构建vs运行时构建 在按照vue1.0的配置配置好webpack后,会出现Failed to mount component: template or render function not ...

  3. LDAP 中 CN,OU,DC 的含意

    CN, OU, DC 都是 LDAP 连接服务器的端字符串中的区别名称(DN, Distinguished Name) LDAP连接服务器的连接字串格式为:ldap://servername/DN   ...

  4. 转:sock_ev——linux平台socket事件框架(socket代理类) .

    前面分析了对socket基本操作的封装,并按照数据的传送方式写了两个类,本篇将写一个代理类提供给库的使用者使用的类. /**************************************** ...

  5. 聊聊iClient for Leaflet坐标转换问题

    作者:非法小恋 背景 SuperMap iClient for JavaScript 9D产品想必大伙都用了一段时间了,针对新推出的三款客户端产品,Leaflet,OpenLayaers,Mapbox ...

  6. 恢复阿里云RDS云数据库MySQL的备份文件到自建数据库

    云数据库MySQL版使用开源软件Percona Xtrabackup对数据库进行备份,所以您可以使用该软件将云数据库MySQL的备份文件恢复到自建数据库中,本文将介绍详细的操作步骤. 关于云数据库My ...

  7. HTTP标头信息

    HTTP头信息头信息由“键:值”组成.它们描述客户端或者服务器的属性.被传输的资源以及应该实现连接. 四种不同类型的头标 通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联 ...

  8. 使用VS2012遇到的问题

    问题1:VS2012 编译程序时:无法查找或打开PDB文件 解决方法:调试-选项-符号-Microsoft符号服务器打钩,然后确定,就OK了. 问题2:按F5运行.c程序,dos窗口闪退 解决方法:C ...

  9. Jackson 时间格式化,时间注解 @JsonFormat 与 @DatetimeFormat 用法、时差问题说明

    @JsonFormat 使用 我们可以有两种用法(我知道的),在对象属性上,或者在属性的 getter 方法上,如下代码所示: 增加到属性上: ... ... /**更新时间 用户可以点击更新,保存最 ...

  10. print()函数的end 参数

    print()函数含end参数时:结束的时候已什么结尾,后面的参数可以是任何形式 [print() 默认以'\n'  结尾] 输出结果:  print()函数不含end参数时: 输出结果: