3

假设我有两个数字,

1号:

1646

2号:

2089

您会看到从左到右添加它们而没有进行加起来 3625 我将如何在 python 中执行此操作?我不确定,但我需要它来添加 9+6,即 15,但当它添加 8+4 时不要继续 1 有没有办法在 python 中添加这样的方法?我正在寻找的最终结果是

3625

因为它不进行剩余数字

4

7 回答 7

8

这将适用于不同长度的整数 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
于 2013-10-08T02:09:28.850 回答
4

因为我喜欢通过开放式请求“更高效”来获得诗意的许可:

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'
于 2013-10-08T01:53:15.630 回答
3

以下代码演示了您想要什么,但请将此视为提示。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)
于 2013-10-08T01:50:05.657 回答
3

即使两个数字中的位数不相同,这也将起作用。

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
于 2013-10-08T02:22:33.930 回答
1

这有点难看,因为我不知道如何在整数中索引一个数字,只有一个字符串,但它可以工作。

如果两个字符串的大小始终相同:

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 索引附加到结果上,然后用剩余的数字重复上述操作。

于 2013-10-08T01:49:08.423 回答
1

数字可能是不同的长度,因此将两者都转换为字符串,反向顺序(使索引更容易),使用扩展切片进行反向([::-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)
于 2013-10-08T02:28:38.080 回答
1

首先将数字转换为字符串,以便我们可以遍历数字:

>>> 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")添加不同长度的数字。

于 2013-10-08T02:50:56.153 回答