Java如何实现给定被除数除数的逐步骤长除法过程格式化输出?
长除法格式化实现思路
核心对齐逻辑
所有行的右边缘统一对齐到被除数的最右侧位置,你可以先把除数、被除数都转成字符串,提前算出全局基准参数:
div_s:转成字符串的除数dvd_s:转成字符串的被除数prefix_len:长除法左侧固定前缀的长度,等于len(div_s) + 2,对应x |(空格+竖线+空格)的总长度total_width:所有输出行的最大宽度,等于prefix_len + len(dvd_s)
顶部商与余数格式化
先算出最终商q = dividend // divisor、余数r = dividend % divisor,把商和余数拼接成{q} r {r}的字符串,直接右对齐到total_width的宽度即可,就能实现和被除数对齐的效果。
减法循环格式化逻辑
逐位计算商的过程中,每一步要输出两个内容:
- 当前要减的乘积:格式为
-{product},右对齐到当前处理到的被除数对应数位的位置,比如第一次处理被除数前两位,乘积的右边缘就对齐到第二位的位置 - 减完的差+落下的下一位被除数:直接右对齐到
total_width宽度即可
可运行Python实现示例
def print_long_division(dividend, divisor): # 基础参数预处理 div_s = str(divisor) dvd_s = str(dividend) prefix_len = len(div_s) + 2 total_width = prefix_len + len(dvd_s) q = dividend // divisor r = dividend % divisor # 打印顶部商和余数 top_line = f"{q} r {r}".rjust(total_width) print(top_line) # 打印除数+竖线+被除数行 second_line = f"{div_s} | {dvd_s}" print(second_line) # 逐步骤计算减法部分 current = 0 digit_pos = 0 # 当前处理到被除数的第几位 while digit_pos < len(dvd_s): # 落下当前位的数字 current = current * 10 + int(dvd_s[digit_pos]) digit_pos += 1 if current < divisor: continue # 计算当前位的商和乘积 current_q = current // divisor product = current_q * divisor # 乘积行的对齐位置:当前处理到的数位对应的右对齐宽度 product_align = prefix_len + digit_pos product_line = f"-{product}".rjust(product_align) print(product_line) # 计算差 current -= product # 差的行(还有未处理的位就拼接下一位,最后一步直接输出余数) if digit_pos < len(dvd_s): next_digit_line = f"{current}{dvd_s[digit_pos]}".rjust(total_width) print(next_digit_line) # 最后打印余数 remainder_line = f"{r}".rjust(total_width) print(remainder_line) # 测试用例 print_long_division(127,5)
运行后输出完全匹配你给出的预期格式。
内容的提问来源于stack exchange,提问作者Ethan Villarosa
相关产品推荐
相关产品推荐

