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