Python中的加法进位

3
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])),但我不认为它会像那样工作。

你所说的“carry”具体指什么? - Andriko13
你在 while 循环内部也有一个 return 语句;这意味着 while 循环将始终只有 1 次迭代。如果这正是你想要的,那么你就不需要 while 循环了。 - Andriko13
дёҖдёӘиҝӣдҪҚжҢҮзҡ„жҳҜпјҡ25+75=100пјҢеӣ дёәжңүдёӨдёӘеҠ жі•еӨ§дәҺ9гҖӮеҲҶеҲ«жҳҜ5+5е’Ң2+7+1пјҲеүҚдёҖж¬ЎеҠ жі•зҡ„иҝӣдҪҚпјүгҖӮ - CoTaNgO
3个回答

1
有趣的一行代码解决方案
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,数学上可以证明:每当有进位时,数字和会减少9。

减少9是因为我们处于十进制系统中,所以如果有进位,我们会在一位上失去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

0

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

  • 你每次都将 carries 设为 0,然后加 1,因此没有办法返回除了 0 以外的任何值。
  • return 在循环内部,因此你总是在第一次迭代后返回。
  • 如果个位数不提供进位,则永远不会进入循环,并返回 None
  • 你没有考虑多个进位,例如 999 + 1 中的三个进位。
  • 如果从 while 循环中删除 return,则会得到一个无限循环:条件的项永远不会改变。你没有迭代任何内容。
  • 你给函数和变量取了相同的名称。这不是好的编程习惯。

以下是基于你原始程序的一个开端。

  • 将进位计数设置为0。
  • 将两个数字转换为字符串并找到公共(较短)长度。
  • 只要两个数字都有数字,就从右侧开始获取数字,并查看它们的数字总和是否需要进位。如果是,则增加计数。

    def carries(): 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
我重写了你的进位函数,使其可以工作,但实现完全不同。首先把数字变成字符串以便迭代。然后通过附加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())

使用快速修复进行编辑


你能解释一下c1和c2是什么吗?非常感谢您的帮助。我只是想理解我正在编程的内容,而不是简单地复制粘贴。另外,在您的while循环中,“while(i>0):..”,为了清晰起见,我可以使一个整数索引吗?如果您不理解我的措辞,我很抱歉,我只是有些困惑,因为我曾经学过只能对字符串进行索引。 - CoTaNgO
你能解释一下"num1 = '0' + num1"的含义或执行过程吗?我不明白为什么我们要将字符串0添加到num1。 - CoTaNgO
是的,c1和c2是每个数字的新大小(带有连接的0的大小)。在while循环中,我们索引一个字符串。这就是为什么在函数的开头我使用str()将number1转换为字符串的原因。 - Andriko13
我选择将0连接到较小的数字上。想象一下,如果您尝试添加999和1会发生什么。如果您只循环遍历个位数,则会忘记再进位2次。因此,我添加了0以使其变为999+001,在这种情况下,我们照顾到了每个数字。 - Andriko13
如果我回答了你的问题,你应该将答案标记为正确,这样其他人就可以看到解决方案。谢谢。 - Andriko13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接