循环小数

来源:互联网 发布:crossover mac 序列号 编辑:程序博客网 时间:2024/05/17 06:09

1/7 = 0.142857142... 是个无限循环小数。
任何有理数都可以表示为无限循环小数的形式。


本题目要求即是:给出一个数字的循环小数表示法。


例如:
输入:
1,5
则输出:
0.2


输入:
1,7
则输出:
0.[142857]

输入:
7,6
则输出:

1.1[6]


用户输入的格式是:

整数,整数


每个整数范围均为:1~1000


程序输出两个整数做除法产生的小数或无限循环小数(循环节用方括号括起)。


共4个测试用例


(2)
输入:
1,8
输出:
0.125


(3)
输入:
8,3
输出:
2.[6]


(3)
输入:
11,13
输出:
0.[846153]


(5)
输入:
2,19
输出:
0.[105263157894736842]

无限循环小数的说明:

在有理数范围内做除法时,最后总可以归结为整数除以整数的问题,假定除数是n,则除法中每步所产生的余数,总是小于n的,即为:0,1,2,...,n-1。当余数为零的时候,商就是整数或者有限小数。当余数始终不为零的时候,由于余数只能是1到n-1中的数,这样或迟或早总会发生余数相同的情况。当同一个余数再次出现时,下一个循环就开始了。如此循环往复所产生的小数,就是无限循环小数。

 

分析:

则此题核心思想既是判断小数部分是否开始循环,所以用到一个动态数组来判断继续增加的余数是否包含在已存在的动态数组里面,否不再,则添加进动态数组,若在,则说明小数开始循环,就进行截取工作。

import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Main {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubScanner sc = new Scanner(System.in);while (sc.hasNext()) {String s = sc.nextLine();String[] ss = s.split(",");int m = Integer.parseInt(ss[0]);int n = Integer.parseInt(ss[1]);StringBuffer result = new StringBuffer();result.append("");List<Integer> lis = new ArrayList<Integer>();//保存所有的商int temp=m/n;m = m % n;while (m != 0) {if (lis.contains(m)) {int i = 0;for (; i < result.length(); i++) {if (result.charAt(i) - '0' == m * 10 / n)break;}result.insert(i, "[");result.insert(result.length(), "]");break;} else {lis.add(m);result.append(m*10/n);}m=m*10%n;//得到余数}System.out.println(temp+"."+result);}}}


0 0
原创粉丝点击