题目描述:
这个代码调bug调到我…
只有一处有问题:
其余应该都没问题
public static String fractionToDecimal(int numerator, int denominator) {
long zhengshu = Math.abs((long)((long)numerator / denominator));
long yushu = numerator % denominator;
StringBuilder sb = new StringBuilder();
// 记录所有出现的余数,用以跳出循环
List<Long> list = new ArrayList<>();
// 记录所有的商用以append
List<Long> temlist = new ArrayList<>();
// 记录循环位置的下标
int index = 0;
// 记录是否出现循环
boolean iscycle = false;
int []getchange = new int[2];
int time = 0;
if(yushu != 0){
getchange = biandedayu(Math.abs(yushu), denominator);
yushu = getchange[0];
time = getchange[1];
}
for (int i = 0; i < time; i++) {
temlist.add((long) 0);
}
while (yushu != 0) {
if(list.contains(Math.abs(yushu))){
iscycle = true;
index = list.indexOf(Math.abs(yushu));
break;
}
list.add(Math.abs(yushu));
temlist.add(Math.abs(yushu * 10 / denominator));
sb.append(Math.abs(yushu * 10/ denominator));
yushu *= 10;
yushu %= denominator;
}
System.out.println(temlist);
if(!iscycle){
if(sb.length() != 0){
sb = addzero(time, sb);
if((numerator <= 0 && denominator <= 0) ||
((numerator >= 0) && (denominator >= 0))){
return zhengshu + "." + sb;
}else {
return "-" + zhengshu + "." + sb;
}
}else {
// sb = addzero(time, sb);
if((numerator <= 0 && denominator <= 0) ||
((numerator >= 0) && (denominator >= 0))){
return zhengshu + "";
}else {
return "-" + zhengshu;
}
}
}else {
sb = new StringBuilder();
// sb = addzero(time, sb);
for (int i = 0; i < index; i ++) {
long integer = temlist.get(i);
sb.append(integer);
}
sb.append("(");
for (int i = index; i < temlist.size(); i ++) {
long integer = temlist.get(i);
sb.append(integer);
}
sb.append(")");
if((numerator <= 0 && denominator <= 0) ||
((numerator >= 0) && (denominator >= 0))){
return zhengshu + "." + sb;
}else {
return "-" + zhengshu + "." + sb;
}
}
}
public static int[] biandedayu(long i,long j){
int index = 0;
j = Math.abs(j);
while (i < j) {
i *= 10;
index ++;
}
System.out.println("得到最小的单位 "+ i / 10);
return new int[]{(int) (i / 10),index - 1};
}
public static StringBuilder addzero(int num,StringBuilder sb){
for (int i = 0; i < num; i++) {
sb = new StringBuilder("0").append(sb);
}
return sb;
}
看看官方给的,再看看我写的。。。
// 别人实现的
public String fractionToDecimal2(int numerator, int denominator) {
if (numerator == 0) {
return "0";
}
StringBuilder fraction = new StringBuilder();
// If either one is negative (not both)
if (numerator < 0 ^ denominator < 0) {
fraction.append("-");
}
// Convert to Long or else abs(-2147483648) overflows
// 全部转成正数
long dividend = Math.abs(Long.valueOf(numerator));
long divisor = Math.abs(Long.valueOf(denominator));
// 把整数部分放入
fraction.append(String.valueOf(dividend / divisor));
long remainder = dividend % divisor;
// 如果余数等于零,直接返回
if (remainder == 0) {
return fraction.toString();
}
fraction.append(".");
Map<Long, Integer> map = new HashMap<>();
while (remainder != 0) {
if (map.containsKey(remainder)) {
fraction.insert(map.get(remainder), "(");
fraction.append(")");
break;
}
map.put(remainder, fraction.length());
remainder *= 10;
fraction.append(String.valueOf(remainder / divisor));
remainder %= divisor;
}
return fraction.toString();
}