假设我有两个数字,
1号:
1646
2号:
2089
您会看到从左到右添加它们而没有进行加起来 3625 我将如何在 python 中执行此操作?我不确定,但我需要它来添加 9+6,即 15,但当它添加 8+4 时不要继续 1 有没有办法在 python 中添加这样的方法?我正在寻找的最终结果是
3625
因为它不进行剩余数字
这将适用于不同长度的整数 N:
from itertools import izip_longest
nums = [1646,
2089,
345]
revs = [str(n)[-1::-1] for n in nums] # nums as reversed strings
izl = izip_longest(*revs, fillvalue = '0') # zip the digits together
xsum = lambda ds: str(sum(map(int, ds)))[-1] # digits -> last digit of their sum
rres = ''.join(xsum(ds) for ds in izl) # result, but as reversed string
res = int(rres[-1::-1]) # result: 3960
类似的想法,但使用map
而不是izip_longest
. 我更喜欢这个。
revs = [str(n)[-1::-1] for n in nums] # nums as reversed strings
dsum = lambda *ds: sum(int(d or 0) for d in ds) # str-digits -> their sum
sums = map(dsum, *revs)[-1::-1] # digit sums, in order
ones = [str(s % 10) for s in sums] # last digits of the sums
res = int(''.join(ones)) # result: 3960
因为我喜欢通过开放式请求“更高效”来获得诗意的许可:
In [49]: a,b = 1646,2089
In [50]: ''.join(str(sum(map(int,x)))[-1] for x in zip(str(a),str(b)))
Out[50]: '3625'
以下代码演示了您想要什么,但请将此视为提示。var 名称和缺乏异常处理将危及您的真实代码。
import operator
n1 = 1646
n2 = 2089
l1 = [int(x) for x in str(n1)]
l2 = [int(x) for x in str(n2)]
res1 = map(operator.add, l1, l2)
res2 = [str(x)[-1] for x in res1]
num = "".join(res2)
print int(num)
即使两个数字中的位数不相同,这也将起作用。
num1, num2, i, temp = 1646, 2089, 10, 0
total = num1 + num2
while num1 or num2:
if (num1 % 10) + (num2 % 10) > 9: temp += i
num1, num2, i = num1 // 10, num2 // 10, i * 10
print total - temp
输出
3625
这有点难看,因为我不知道如何在整数中索引一个数字,只有一个字符串,但它可以工作。
如果两个字符串的大小始终相同:
A = str(1646)
B = str(2089)
result = ""
for i in range(0,len(A)):
result += str((int(A[i]) + int(B[i]))%10)
result = int(result)
如果两个字符串的大小并不总是相同,请找出哪个更大(长度方面)。假设最大的长度是 X,其他长度是 Y,其中 X > Y。将较大字符串的第一个 XY 索引附加到结果上,然后用剩余的数字重复上述操作。
数字可能是不同的长度,因此将两者都转换为字符串,反向顺序(使索引更容易),使用扩展切片进行反向([::-1],在 Python 中反转字符串),反向返回,
result=""
A=str(1646)[::-1]
B=str(2089)[::-1]
for ndx in range(0,max(len(A),len(B)):
result += str(int(A[ndx])+int(B[ndx]))
resut = int(result[::-1])
您可以很容易地进行携带,并(明确地)处理不等长度的字符串,
#!/bin/env python
a=1646
b=20893
A=str(a)[::-1]
B=str(b)[::-1]
lenA = len(A)
lenB = len(B)
length = max(lenA,lenB)
print "length: "+str(length)
#string add,no carry
total=""
for ndx in range(0,length):
digit = 0
if(ndx<lenA):
digit += int(A[ndx])
if(ndx<lenB):
digit += int(B[ndx])
digit = digit%10
#print "digit: "+str(digit)+", carry: "+str(carry)
total += str(digit)
print "a: " +str(a)+"+b: " +str(b)
result = total[::-1]
resut = int(result)
print "result: " +str(result)
#string add,with carry
total=""
carry=0
for ndx in range(0,length):
digit = carry
if(ndx<lenA):
digit += int(A[ndx])
if(ndx<lenB):
digit += int(B[ndx])
carry = digit/10
digit = digit%10
#print "digit: "+str(digit)+", carry: "+str(carry)
total += str(digit)
if(carry>0):
total += str(carry)
#print "digit: "+str(digit)+", carry: "+str(carry)
print "a: " +str(a)+"+b: " +str(b)
result = total[::-1]
resut = int(result)
print "result: " +str(result)
首先将数字转换为字符串,以便我们可以遍历数字:
>>> n1 = str(1646)
>>> n2 = str(2089)
然后我们可以添加相应的数字然后做得到%10
最后一个数字。将两个整数0-9相加得到的所有数字都将是<= 18,因此%10
将始终返回最后一个数字。
>>> [(int(a)+int(b))%10 for a,b in zip(n1,n2)]
[3, 6, 2, 5]
然后我们将每个 int 转换为字符串,连接数字并转换回 int:
>>> int(''.join(map(str,((int(a)+int(b))%10 for a,b in zip(n1,n2)))))
3625
或者(随时转换数字):
>>> int(''.join(str((int(a)+int(b))%10) for a,b in zip(n1,n2)))
3625
用于izip_longest(...,fillvalue="0")
添加不同长度的数字。