Java 小数到循环小数

Java 小数到循环小数,java,algorithm,Java,Algorithm,在这个问题上的工作,也做了一些参考类似的解决方案。我感到困惑的是,为什么只要有一个重复的数字,我们就打破循环?是否可能重复2-3次,然后换成另一个不同的号码?谢谢 我特别是指这部分, if (map.containsKey(num)) { int index = map.get(num); res.insert(index, "("); res.append(")"); break;

在这个问题上的工作,也做了一些参考类似的解决方案。我感到困惑的是,为什么只要有一个重复的数字,我们就打破循环?是否可能重复2-3次,然后换成另一个不同的号码?谢谢

我特别是指这部分,

        if (map.containsKey(num)) {
            int index = map.get(num);
            res.insert(index, "(");
            res.append(")");
            break;
        }
问题,

给定表示分数的分子和分母的两个整数,以字符串格式返回分数

如果分数部分重复,请将重复部分括在括号中

比如说,

给定分子=1,分母=2,返回“0.5”。 给定分子=2,分母=1,返回“2”。 给定分子=2,分母=3,返回“0.(6)”

公共类解决方案{
公共字符串fractionToDecimal(整型分子,整型分母){
如果(分子==0){
返回“0”;
}
StringBuilder res=新的StringBuilder();
//“+”或“-”
res.append((分子>0)^(分母>0))?“-”:”;
long num=数学abs((长)分子);
long den=数学绝对值((长)分母);
//组成部分
res.append(num/den);
num%=den;
如果(num==0){
return res.toString();
}
//分数部分
决议附件(“.”);
HashMap=newHashMap();
map.put(num,res.length());
while(num!=0){
num*=10;
res.append(num/den);
num%=den;
if(映射容器(数量)){
int index=map.get(num);
决议插入(索引,“(”);
决议附件(“)”;
打破
}
否则{
map.put(num,res.length());
}
}
return res.toString();
}
}
提前感谢,,
Lin

很明显,一个十进制数可能重复出现两个或更多的小数,然后是另一个小数。例如449/1000=0.449

很明显,一个十进制数可能重复出现两个或多个小数,然后是另一个小数。例如,449/1000=0.449,当代码看到一个数字重复时,它不会停止。当它注意到它已经达到它已经处于的状态时,它停止。如果它再次达到相同的状态,这意味着我们将重复我们已经做过的除法,这意味着股息和余数将是相同的,我们将做我们已经做过的一系列步骤

当这种情况发生时,它意味着重复,它停止并添加括号

例如,让我们用123除以999。这应该给我们重复的小数点0.123123…,因此输出应该是
0.(123)

  • 123/999是0。剩下的是123。我们从
    0开始。
  • 将余数乘以10。现在我们有1230/999。股息为1,剩余为231。现在我们有了
    0.1
  • 将余数乘以10。现在我们有2310/999。股息为2,余数为312。现在我们有了
    0.12
  • 将余数乘以10。现在我们有3120/999。股息是3,剩余的是123。现在我们有了
    0.123
  • 将余数乘以10。现在我们有1230/999。。。等等,我们已经做过了!这意味着当我们继续除以时,我们会一次又一次地得到这个数字。停止并在重复部分周围放置括号

地图告诉我们已经划分了哪些数字,以及
StringBuilder
中的哪个索引。当我们找到一个已经除以的数字时,我们使用该索引来知道插入括号的位置

代码在看到重复的数字时不会停止。当它注意到它已经达到它已经处于的状态时,它停止。如果它再次达到相同的状态,这意味着我们将重复我们已经做过的除法,这意味着股息和余数将是相同的,我们将做我们已经做过的一系列步骤

当这种情况发生时,它意味着重复,它停止并添加括号

例如,让我们用123除以999。这应该给我们重复的小数点0.123123…,因此输出应该是
0.(123)

  • 123/999是0。剩下的是123。我们从
    0开始。
  • 将余数乘以10。现在我们有1230/999。股息为1,剩余为231。现在我们有了
    0.1
  • 将余数乘以10。现在我们有2310/999。股息为2,余数为312。现在我们有了
    0.12
  • 将余数乘以10。现在我们有3120/999。股息是3,剩余的是123。现在我们有了
    0.123
  • 将余数乘以10。现在我们有1230/999。。。等等,我们已经做过了!这意味着当我们继续除以时,我们会一次又一次地得到这个数字。停止并在重复部分周围放置括号

地图告诉我们已经划分了哪些数字,以及
StringBuilder
中的哪个索引。当我们找到一个已经除以的数字时,我们使用该索引来知道插入括号的位置

如果我们使用四年级学的长除法,这个问题其实很容易解决

假设你需要把92除以22。您如何使用长除法来完成它。如何检测重复模式

很简单,当您遇到以前遇到的提醒时,您知道您有一个重复的小数模式。您需要将提醒和结果的相应索引存储在字典中,并使用相同的方法检测/打印重复的小数。下面是正在工作的python代码

def divide(numerator, denominator):
    sign, res, lead = '', '', ''
    if (numerator < 0) ^ (denominator < 0) and numerator != 0:
        sign = '-'
    numerator = abs(numerator)
    denominator = abs(denominator)
    remainders = defaultdict(list)

    if numerator < denominator:
        lead = '0'
    _x = str(numerator)
    r = 0
    i = 0
    j = 0
    while True:
        if i < len(_x):
            d = int(str(r)+_x[i])
            q = d // denominator
            if not (q == 0 and len(res) == 0):
                res += str(q)
            r = d - (q * denominator)
            i += 1
        elif i >= len(_x) and j <= 9223372036854775807:
            if r == 0:
                return sign+lead+res
            if j == 0:
                remainders[r] = [True, len(res)+1]
                res += '.'
            d = int(str(r) + '0')
            q = d // denominator
            res += str(q)
            r = d - (q * denominator)
            if remainders[r] and remainders[r][0]:
                res = res[0:remainders[r][1]] + '(' + res[remainders[r][1]:] + ')'
                return sign+lead+res
            remainders[r] = [True, len(res)]
            j += 1
        else:
            return sign+lead+res
def除法(分子、分母):
符号,res,lead=“”,“”,“”
if(分子<0)^(分母<0)和分子a
def divide(numerator, denominator):
    sign, res, lead = '', '', ''
    if (numerator < 0) ^ (denominator < 0) and numerator != 0:
        sign = '-'
    numerator = abs(numerator)
    denominator = abs(denominator)
    remainders = defaultdict(list)

    if numerator < denominator:
        lead = '0'
    _x = str(numerator)
    r = 0
    i = 0
    j = 0
    while True:
        if i < len(_x):
            d = int(str(r)+_x[i])
            q = d // denominator
            if not (q == 0 and len(res) == 0):
                res += str(q)
            r = d - (q * denominator)
            i += 1
        elif i >= len(_x) and j <= 9223372036854775807:
            if r == 0:
                return sign+lead+res
            if j == 0:
                remainders[r] = [True, len(res)+1]
                res += '.'
            d = int(str(r) + '0')
            q = d // denominator
            res += str(q)
            r = d - (q * denominator)
            if remainders[r] and remainders[r][0]:
                res = res[0:remainders[r][1]] + '(' + res[remainders[r][1]:] + ')'
                return sign+lead+res
            remainders[r] = [True, len(res)]
            j += 1
        else:
            return sign+lead+res
/**
 * Given two integers a and b, return the result as a String.
 * Display the repeating part of the fraction in parenthesis.
 *
 * Runs in O(b)
 *
 * @author Raed Shomali
 */
public class Divider {

    private static final String DOT = ".";
    private static final String ERROR = "ERROR";
    private static final String LEFT_PARENTHESIS = "(";
    private static final String RIGHT_PARENTHESIS = ")";

    public static String divide(final int a, final int b){
        if (b == 0) {
            return ERROR;
        }

        int value = a / b;
        int remainder = a % b;
        return String.valueOf(value) + DOT + divider(remainder, b);
    }

    private static String divider(final int a, final int b) {
        final Map<Integer, Integer> remainderIndexMap = new HashMap<>();
        final List<Integer> values = new ArrayList<>();

        int value;
        int remainder = a;
        while (!remainderIndexMap.containsKey(remainder)) {
            remainderIndexMap.put(remainder, values.size());

            remainder *= 10;
            value = remainder / b;
            remainder = remainder % b;
            values.add(value);
        }

        final int index = remainderIndexMap.get(remainder);
        final StringBuilder result = new StringBuilder();
        for (int i = 0; i < index; i++) {
            result.append(values.get(i));
        }
        result.append(LEFT_PARENTHESIS);
        for (int i = index; i < values.size(); i++) {
            result.append(values.get(i));
        }
        result.append(RIGHT_PARENTHESIS);
        return result.toString();
    }
}
divide(0, 0)     // "ERROR"
divide(1, 2)     // "0.5(0)"
divide(0, 3)     // "0.(0)"
divide(10, 3)    // "3.(3)"
divide(22, 7)    // "3.(142857)"
divide(100, 145) // "0.(6896551724137931034482758620)"