蓝桥杯-有理数循环节问题

1/7 = 0.142857142… 是个无限循环小数。
任何有理数都可以表示为无限循环小数的形式。
题目要求:给出一个数字的循环小数表示法
输入描述
输入一行,两个整数。
每个整数范围均为:1~1000
例如:
样例输入:
1,7
输出描述:
输出两个整数做除法产生的小数或无限循环小数(循环节用方括号括起)。
对应输出:
0.[142857]
运行限制
最大运行时间:1s
最大运行内存: 256M
该题为蓝桥杯真题(简单)
讲解:输出循环小数,并将循环节用【】括起来。测试数据在我看来需要通过以下几点:
(1)1,7
(2)4,3
(3)2,5 和5,2和12/4
针对这道题,先判断经过运算余数是否为零(是否可以除尽),如果可以直接输出运算后的结果。
蓝桥杯-有理数循环节问题_第1张图片
做除法运算时可知,
蓝桥杯-有理数循环节问题_第2张图片
对应代码里面得while语句
代码如下

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String tr = sc.nextLine();
        String str[] = tr.split(",");
        //输入的分子和分母
        double m = Integer.valueOf(str[0]);
        double n = Integer.valueOf(str[1]);
       //扩大分子,运算余数不为零,则不能被除尽
       //每个整数范围均为:1~1000(题目给出),所以咱们直接将分子乘1000
        if(m*1000%n!=0)
        {
            //输出的整数部分
            int  a = (int) ((int )m / n);
            //fz是m/n中的余数
            double fz = m - (a*n);
            int i = 0, flag = 0;
            //xs用来存储小数部分的结果
            int sx[] = new int[80];
            //存储小数结果各部分所对应的分子大小
            int fzz[]=new int [80];
            while (true) {
                sx[i] = (int)(fz * 10 / n);
                fzz[i]=(int)fz;
                fz = fz * 10 % n;
                //查看fz是否与历史数值相同,如果重复的话(flag=1)退出计算
                for(int k=0;k<=i;k++)
                {
                    if (fz ==fzz[k] ) {
                        flag++;
                    }
                }
                if (flag == 1)
                    break;
                i++;
            }
            //输出结果
            System.out.print(a+"."+"[");
            for(int j=0;j<=i;j++)
                System.out.print(sx[j]);
            System.out.print("]");
        }
        else
        {
            System.out.print(m/n);
        }
    }
}

欢迎大家批评指正,有好的思路也可以与我分享交流,与君共同进步!

你可能感兴趣的:(刷题,java)