大数相除求得商和余数
def divide_big_numbers(dividend: str, divisor: str):
if divisor == "0":
raise ValueError("Divisor cannot be zero.")
# 判断结果符号
negative = False
if dividend[0] == '-':
negative = not negative
dividend = dividend[1:]
if divisor[0] == '-':
negative = not negative
divisor = divisor[1:]
# 去掉前导0
dividend = dividend.lstrip('0') or '0'
divisor = divisor.lstrip('0') or '0'
# 边界情况
if compare(dividend, divisor) < 0:
return ("0", "-" + dividend if negative and dividend != "0" else dividend)
quotient = ""
remainder = ""
for digit in dividend:
remainder += digit
remainder = remainder.lstrip('0') or '0'
# 找当前可以除以几次
count = 0
while compare(remainder, divisor) >= 0:
remainder = subtract(remainder, divisor)
count += 1
quotient += str(count)
# 添加符号
if negative and quotient != "0":
quotient = "-" + quotient
return quotient.lstrip('0') or '0', remainder
def compare(num1: str, num2: str) -> int:
"""比较两个数字字符串大小"""
if len(num1) != len(num2):
return len(num1) - len(num2)
return (num1 > num2) - (num1 < num2)
def subtract(num1: str, num2: str) -> str:
"""大数减法,num1 >= num2"""
num1 = list(map(int, num1))
num2 = list(map(int, num2.rjust(len(num1), '0')))
res = []
borrow = 0
for i in range(len(num1)-1, -1, -1):
sub = num1[i] - num2[i] - borrow
if sub < 0:
sub += 10
borrow = 1
else:
borrow = 0
res.append(str(sub))
return ''.join(res[::-1]).lstrip('0') or '0'
大数相除结果保留两位小数
def divide_with_precision(dividend: str, divisor: str, precision: int = 2):
if divisor == "0":
raise ValueError("Divisor cannot be zero.")
negative = False
if dividend.startswith('-'):
negative = not negative
dividend = dividend[1:]
if divisor.startswith('-'):
negative = not negative
divisor = divisor[1:]
dividend = dividend.lstrip('0') or '0'
divisor = divisor.lstrip('0') or '0'
# 整数部分
quotient, remainder = divide_big_numbers(dividend, divisor)
# 小数部分
decimal = ""
for _ in range(precision):
remainder += "0"
digit, remainder = divide_big_numbers(remainder, divisor)
decimal += digit
result = quotient + "." + decimal
if negative and result != "0.00":
result = "-" + result
return result
# 用 divide_big_numbers 实现整数除法并返回余数
def divide_big_numbers(dividend: str, divisor: str):
if compare(dividend, divisor) < 0:
return "0", dividend
quotient = ""
remainder = ""
for digit in dividend:
remainder += digit
remainder = remainder.lstrip('0') or '0'
count = 0
while compare(remainder, divisor) >= 0:
remainder = subtract(remainder, divisor)
count += 1
quotient += str(count)
return quotient.lstrip('0') or '0', remainder
def compare(num1: str, num2: str) -> int:
if len(num1) != len(num2):
return len(num1) - len(num2)
return (num1 > num2) - (num1 < num2)
def subtract(num1: str, num2: str) -> str:
num1 = list(map(int, num1))
num2 = list(map(int, num2.rjust(len(num1), '0')))
res = []
borrow = 0
for i in range(len(num1) - 1, -1, -1):
sub = num1[i] - num2[i] - borrow
if sub < 0:
sub += 10
borrow = 1
else:
borrow = 0
res.append(str(sub))
return ''.join(res[::-1]).lstrip('0') or '0'