zoukankan      html  css  js  c++  java
  • 算法笔记_229:有理数的循环节(Java)

    目录

    1 问题描述

    2 解决方案

     


    1 问题描述

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

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

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

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

    输入:
    7,6
    则输出:
    1.1[6]

    用户输入的格式是:
    整数,整数

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

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


    2 解决方案

     1 import java.math.BigDecimal;
     2 import java.util.ArrayList;
     3 import java.util.Scanner;
     4 
     5 public class Main {
     6     
     7     public static void main(String[] args) {
     8         Scanner in = new Scanner(System.in);
     9         String s = in.next();
    10         String[] arrayS = s.split(",");
    11         BigDecimal a = new BigDecimal(arrayS[0]);
    12         BigDecimal b = new BigDecimal(arrayS[1]);
    13         a = a.divide(b, 200, BigDecimal.ROUND_UP );
    14         String temp = "" + a;
    15         String t = "" + Double.valueOf(arrayS[0]) / Double.valueOf(arrayS[1]);
    16         if(t.length() < 18) {
    17             System.out.println(t);
    18             return;
    19         }
    20         String temp1 = temp.substring(2);
    21         ArrayList<Character> list = new ArrayList<Character>();
    22         for(int i = 0;i < temp1.length();i++) {
    23             if(!list.contains(temp1.charAt(i)))
    24                 list.add(temp1.charAt(i));
    25             else {
    26                 int start = list.indexOf(temp1.charAt(i));
    27                 int k = i, j = start;
    28                 for(;j < list.size() && k < 198;j++,k++) {
    29                     if(list.get(j) != temp1.charAt(k))
    30                         break;
    31                 }
    32                 if(j == list.size()) {
    33                     if((j - start == 1 && temp1.charAt(i) == '0')) {
    34                         list.add(temp1.charAt(i));
    35                         continue;
    36                     }
    37                     System.out.print(temp.substring(0, 2));
    38                     for(int p = 0;p < list.size();p++) {
    39                         if(p == start)
    40                             System.out.print("[");
    41                         System.out.print(list.get(p));
    42                     }
    43                     System.out.print("]");
    44                     return;
    45                 } else
    46                     list.add(temp1.charAt(i));
    47             }
    48         }
    49     }
    50 }

    运行结果:

    5,888
    0.005[630]
    
    
    2,19
    0.[105263157894736842]
  • 相关阅读:
    AutoLISP 绘制滚轮
    铁打的学校流水的学生
    AutoLISP绘制花型三
    AutoCAD LISP花型图案二
    AutoCAD LISP多边形边为直径绘制圆
    AutoCAD矩形交叉口框短边切圆一
    AutoCAD LISP花型图案一
    AutoLISP圆形堆栈金字塔
    AutoCAD矩形交叉口框短边切圆二
    AutoCADLISP绘制楼梯
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6897447.html
Copyright © 2011-2022 走看看