加法进位 Python

Addition carries in Python

number1 = int(input('Number #1: '))
number2 = int(input('Number #2: '))
l = len(str(number1))
l1 = len(str(number2))
print()

def addition():
    print(' ',max(number1,number2))
    print('+')
    print(' ',min(number1,number2))
    print('-'*(max(l,l1)+2))
    print('  ')
    print(' ',number1+number2)

def carries():
    while (int(str(number1)[::-1])+int(str(number2)[::-1]))>=10:
        carries = 0
        carries = carries + 1     
        return carries

addition()


print()
print('Carries : ',carries())

我正在尝试编写一个程序,将两个用户输入的数字相加并计算答案,同时说明有多少个进位。进位如果9+8=17,则进位为1,以此类推。我在让我的程序超出 1 个进位时遇到问题。所以这个程序到目前为止只适用于用户输入的数字,当添加时低于 99。如果你能向我解释我将如何改变这个程序以使其适用于任何数字,那就太好了。我在考虑使用 len(number1) 和 len(number2) 然后向后输入用户输入的字符串,这样它看起来像 str(number1[::-1])) 但我不认为它是那样工作的.

您的 while 循环存在致命缺陷。

  • 你每次都把carries设置为0,然后加1,所以没办法return除了0。
  • return 在循环内部,所以在第一次迭代后你总是 return。
  • 如果个位不提供进位,那么你永远不会进入循环,并且return None.
  • 你没有提供多进位,比如999+1中的三进位。
  • 如果从 while 循环中删除 return,则会出现无限循环:条件的条款从不改变。你不会遍历任何东西。
  • 你给了一个函数和一个变量同名。这不是好的做法。

这是您的一个开始,大致基于您原来的例程。

  • 将进位计数设置为0。
  • 将两个数字转换为字符串并找到共同的(较短的)长度。
  • 只要你在两个数字中都有数字,就抓取数字(从右端开始),看看它们的数字和是否需要进位。如果是这样,请增加计数。

    def 携带(): carry_count = 0 str1 = str(number1) str2 = str(number2)

    for digit_pos in range(1, min(len(str1), len(str2)) + 1):
        if int(str1[-digit_pos]) + int(str2[-digit_pos]) >= 10:
            carry_count += 1
    return carry_count
    

示例输出:

Number #1: 77077
Number #2: 4444

77077
+
4444
-------

81521

Carries : 3

这里还有不足之处,有待您修正。最值得注意的是,它不处理多个进位。但是,它应该可以帮助您找到解决方案。

我重写了你的进位函数所以它可以工作,但是实现完全不同。您首先制作数字字符串,以便您可以遍历它们。然后通过附加 0 使它们的长度相等,并遍历每个数字以检查它们的总和(加上进位)是否超过 9。如果超过,则增加计数器。希望这会有所帮助:

number1 = int(input('Number #1: '))
number2 = int(input('Number #2: '))
l = len(str(number1))
l1 = len(str(number2))
print()
def addition():
    print(' ',max(number1,number2))
    print('+')
    print(' ',min(number1,number2))
    print('-'*(max(l,l1)+2))
    print('  ')
    print(' ',number1+number2)

def carries():
    num1 = str(number1)
    num2 = str(number2)
    carry = 0
    carries = 0
    c1 = l
    c2 = l
    if (l < l1):
        while (c1 < l1):
            num1 = '0' + num1
            c1+=1
    if (l1 < l):
        while (c2 < l):
            num2 = '0' + num2
            c2+=1
    i = c1
    while (i > 0):
        if (int(num1[i-1])+int(num2[i-1])+carry > 9):
            carry = 1;
            carries+=1
        else:
            carry = 0
        i-=1
    return carries
addition()


print()
print('Carries : ',carries())

已编辑快速修复

有趣的单行解决方案

def numberOfCarryOperations(a, b):
    f=lambda n:sum(map(int,str(n)));return(f(a)+f(b)-f(a+b))/9

# f is the digitSum function :)

说明

断言a,b >=0,可以数学证明:每进位一次,digitSum减9。

9,因为我们是10数制,所以我们"lose 10"一个数字,如果有进位,我们得到+1作为进位。

可读的解决方案

def digitSum(n):
    return sum(map(int,str(n)))

def numberOfCarryOperations(a, b)
    # assert(a >= 0); assert(b >= 0);
    return (digitSum(a) + digitSum(b) - digitSum(a+b)) / 9