JavaScript:
//a,b均为整数,b不为0
//返回字符串,代表分数的小数表示
function divide(a, b) {
//能整除直接返回
if(a % b === 0) return a / b;
//不能整除分两种情况,结果是有限小数,结果是无限循环小数
//sign,存储结果正负号
let sign = "";
if(a > 0 && b < 0 || a < 0 && b > 0) sign = "-";
//如果a,b是负数,转为正数
a = Math.abs(a);
b = Math.abs(b);
//整数部分round
let round = Math.floor(a / b);
//余数
let rest = a % b;
//decimal数组用于存储小数位
let decimal = [];
//map,建立余数与decimal数组下标之间的关系,以便寻找循环节
let map = new Map();
//res存储结果
let res = sign + round + ".";
//以下代码模拟小学学的除式计算除法步骤
do {
map.set(rest, decimal.length);
rest *= 10;
decimal.push(Math.floor(rest / b));
rest %= b;
if(rest === 0) {
//说明结果是有限小数
res += decimal.join("");
break;
}
let loop = map.get(rest);
if(loop !== undefined) {
//说明结果是无限循环小数,且循环节从decimal数组下标为loop的位置开始
for(let i = 0; i < loop; i++) {
res += decimal[i];
}
res += "(";
for(let i = loop; i < decimal.length; i++) {
res += decimal[i];
}
res += ")";
break;
}
} while (true);
return res;
}
Python:
def divide(a, b):
# 参数:整数分子a, 分母b;返回值(a/b)类型:字符串
ret = '' # python没有整除,//是向下取整,不同于C
if (a > 0) and (b < 0) or (a < 0) and (b > 0): ret = '-'
a = abs(a) # 结果的符号已经确定,把a,b作正数处理
b = abs(b) # 因为python模运算不同于C
ret += str(a // b)
left = a % b
if left == 0: return ret # 可整除
a = left # 将分子化为小于分母
i = 0
s = {a: i, } # 用字典存储余数,便于快速判断余数是否已存在
res = '' # res为结果的小数部分
while True:
a *= 10
while a < b:
res += '0'
a *= 10
res += str(a // b)
left = a % b
if left == 0: break
if s.get(left, -1) >= 0: # 余数重复出现,找到循环节
st = s.get(left) # 循环节起始位置
res = res[:st] + '(' + res[st:] + ')'
break
i += 1
s[left] = i # 余数加入字典中
a = left
return ret + '.' + res