加法进位 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
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