question:小数化分数2

思路:

/**

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

 *
* ①普通有限小数
*
* ②纯循环小数
*
* ③混循环小数
*
* 下面就挨个说它的转化方法:
*
* ①这一类很简单,分子就是小数点后面的数,分母就是10的n次方(n为小数点后面位数)
*
* ②这个小学学奥数的时候老师讲过,也不是很难:分子是循环的数,分母就是和它位数相同的9,比如0.(14),那么就是14/99
*
* ③这个就比上面的多了一步,我也是查了百度百科才知道的。下面就直接用百度百科的例子说明吧,仔细看看就发现方法了:
*
* 0.0105˙717˙=(105717-105)/9990000=105612/9990000=8801/832500
*
* 0.0˙869˙=869/9990,0.00˙716˙=716/99900=179/24975
*
* 0.368˙616˙=(368616-368)/999000=368248/999000=46031/124875
*
* 观察一下,就是小数部分减去不循环部分作为分母,分母就是循环部分个9和非循环部分个0组成,也许这么说很迷,还是看上面例子吧。
*注:此注释来自其他博主博客,下边儿是链接
*https://blog.csdn.net/wyg1997/article/details/50533242
*/

source code:

package hduoj;

import java.util.Scanner;

/**
* 这道题没有整数部分,也就是说数组直接从a[2]开始后面是小数,我把这道题分为了三类:
*
* ①普通有限小数
*
* ②纯循环小数
*
* ③混循环小数
*
* 下面就挨个说它的转化方法:
*
* ①这一类很简单,分子就是小数点后面的数,分母就是10的n次方(n为小数点后面位数)
*
* ②这个小学学奥数的时候老师讲过,也不是很难:分子是循环的数,分母就是和它位数相同的9,比如0.(14),那么就是14/99
*
* ③这个就比上面的多了一步,我也是查了百度百科才知道的。下面就直接用百度百科的例子说明吧,仔细看看就发现方法了:
*
* 0.0105˙717˙=(105717-105)/9990000=105612/9990000=8801/832500
*
* 0.0˙869˙=869/9990,0.00˙716˙=716/99900=179/24975
*
* 0.368˙616˙=(368616-368)/999000=368248/999000=46031/124875
*
* 观察一下,就是小数部分减去不循环部分作为分母,分母就是循环部分个9和非循环部分个0组成,也许这么说很迷,还是看上面例子吧。
*
*/
public class hdoj_1717_小数转换成分数 {
static int gcd(int a,int b){
if(b==0)return a;
return gcd(b,a%b);
} static void print(int a,int b){
int gcd = gcd(a,b);
System.out.println(a/gcd+"/"+b/gcd);
} public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = Integer.parseInt(sc.next());
while(count--!=0){
String data = sc.next();
if(data.contains("(")){//说明是循环小数
String temp = data.substring(data.indexOf('(')+1,data.indexOf(')'));
if(data.indexOf("(")==2){//说明是纯循环小数
int len = temp.length();
int numerator = Integer.parseInt(temp);
StringBuilder de_str = new StringBuilder();
while(len--!=0){
de_str.append(9);
}
int denominator = Integer.parseInt(de_str.toString());
print(numerator,denominator);
}else{//说明是混循环小数
String before_the_brc = data.substring(data.indexOf('.')+1,data.indexOf('('));
String temp_in = before_the_brc+temp;
int numerator = Integer.parseInt(temp_in)-Integer.parseInt(before_the_brc);
int la_len = temp.length();
int be_len = before_the_brc.length();
StringBuilder de_str = new StringBuilder();
while(la_len--!=0){
de_str.append(9);
}
print(numerator,Integer.parseInt(de_str.toString())*(int)Math.pow(10,be_len));
}
}else{//说明是普通小数
String temp = data.substring(data.indexOf('.')+1);
int pow = temp.length();
int numerator = Integer.parseInt(temp);
int denominator = (int)Math.pow(10,pow);
print(numerator,denominator);
}
}
}
}

代码已经ac

希望对大家有所帮助

以上

最新文章

  1. VMware 虚拟上网的的三种模式 ——bridged、host-only、NAT 模式
  2. Python 开发轻量级爬虫07
  3. selenium实战-Compound class names not permitted
  4. 关于TortoiseGit使用的心得
  5. Http协议:彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
  6. GPIB:永远不会被淘汰 (转载)
  7. response content-type json
  8. mustache模板渲染的基本原理
  9. 14、到底改如何区分android的平板、电视、手机
  10. SQL Server批量更新数据
  11. C++多态性与C#的比较
  12. javascript DOM操作 第19节
  13. 根据地址查询经纬度.html
  14. LightOJ_1248 Dice (III)
  15. ASP.NET通用权限组件思路设计
  16. Maven命令行创建web项目,并部署到jobss当中(解决No plugin found for prefix 'jboss-as' in the current project and in the plugin groups [org.apache.maven.plugins,问题)
  17. php项目中常用的log日志记录方法
  18. android获取Context
  19. 64 位 Windows 平台开发注意要点之文件系统重定向
  20. Solidity-让合约地址 接受ETH的转账充值的 三种方式

热门文章

  1. GraphQL + React Apollo + React Hook 大型项目实战(32 个视频)
  2. 【EasyUI总结】EasyUI开发中遇到的坑
  3. cf1184E1
  4. Python安装和配置环境变量(简明教程)
  5. java中equals与==号的区别
  6. PAT (Advanced Level) Practice 1035 Password (20 分)
  7. SAP 登录Fiori的user和登录WEB UI的business role之间的关系。
  8. ArcMap 导入 CGCS2000 点坐标数据
  9. python3运行时候报错集锦:读取文件报错
  10. JS 获取验证码 倒计时