日期:2014-05-20 浏览次数:20719 次
public static void main(String[] args) { // int a = 10, b = 2; // int a = 1, b = 7; // int a = 7, b = 6; // int a = 1, b = 5; int a = 1, b = 101; int gong_yue_shu = find_GongYueShu(a, b); a = a/gong_yue_shu; b = b/gong_yue_shu; int c = a/b; List<Integer> result = new ArrayList<Integer>(); result.add(c); a = a-c*b; int count = b*3; while(a!=0) { a = a*10; c = a/b; result.add(c); a = a-c*b; count--; if(count==0) { break; } } printDecimal(result, b); } //找出最大公约数 private static int find_GongYueShu(int a, int b) { int min = Math.min(a, b); int result = 1; for(int i=2; i<=min; i++) { if(a%i==0 && b%i==0) { result = i; } } return result; } //打印结果 private static void printDecimal(List<Integer> l, int b) { int[] a = findRepeatParts(l, b); if(l.size()<3*b-1) { //如果列表很短,则表明是可以除尽的小数,无循环体 a[0] = Integer.MAX_VALUE; a[1] = Integer.MAX_VALUE; } System.out.print(l.get(0)); if(l.size()>1) { System.out.print('.'); } int k=Math.min(a[1], l.size()); for(int i=1; i<k; i++) { if(i==a[0]) { System.out.print('['); } System.out.print(l.get(i)); } if(k==a[1]) System.out.println(']'); } //找出循环体 private static int[] findRepeatParts(List<Integer> l, int b) { int[] a = new int[2]; boolean flag = true; for(int i=1; i<=b; i++) {//循环体的初始位置,有些循环体从第一位小数开始,有些不是(如1/6) for(int j=1; j<b; j++) { //循环体的长度,从长度为1开始检验,一直检验到长度为b,总能找到循环体 for(int x=0; x<j; x++) { //根据循环体的长度,检测每个位置是否都一直在循环 for(int k=i+j+x; k<l.size(); k=k+j) { //检测是否一直在循环 if(l.get(k) != l.get(i+x)) { flag = false; x=j; break; } } } if(flag == true) { a[0] = i; a[1] = i+j; i=b; break; }else { flag = true; } } } return a; }
------解决方案--------------------
import java.math.BigDecimal; public class BigDecimalFormat { static int subStrCnt(String str, String subStr) { int i, j, k, cnt = 0; for (i = 0; i <= str.length() - subStr.length(); ++i) { k = i; j = 0; while (str.charAt(k) == subStr.charAt(j)) { ++k; ++j; if (j >= subStr.length()) { ++cnt; break; } } } return cnt; } public static String getSubStr(String str) { int count = 0; String loopStr = null; int i, j, start, tmp; int strLen = str.length(); String dst = new String(); for (j = 1; j <= strLen; ++j) { for (i = 0; i <= strLen - j; ++i) { start = i; dst = str.substring(i, i + j); int cnt = subStrCnt(str, dst); if (dst.length() == 1 && cnt < str.length() - str.indexOf(dst)) { continue; } if (loopStr == null || (loopStr.length() <= dst.length() && count <= cnt)) { loopStr = dst; count = cnt; } } } return loopStr; } static public void main(String[] args) { BigDecimal x = new BigDecimal(7); BigDecimal y = new BigDecimal(6); String divRst = x.divide(y, 30, BigDecimal.ROUND_DOWN).toString(); while (divRst.charAt(divRst.length() - 1) == '0') { divRst = divRst.substring(0, divRst.length() - 1); } String loopStr = getSubStr(divRst); String rst = null; if (loopStr == divRst) { rst = divRst; } else { rst = divRst.replaceAll(loopStr, "") + "[" + loopStr + "]"; } System.out.println(rst); } }