Loading

[字符串运算]字符串除法

大数相除求得商和余数

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'

posted @ 2025-04-10 14:59  Duancf  阅读(58)  评论(0)    收藏  举报