添加号码而不携带

时间:2013-10-08 01:30:59

标签: python math

假设我有两个号码,

第1名:

1646

2号:

2089

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

3625

因为它没有剩余的数字

7 个答案:

答案 0 :(得分:7)

这将适用于不同长度的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

答案 1 :(得分: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'

答案 2 :(得分: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)

答案 3 :(得分: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

答案 4 :(得分: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.将较大字符串的第一个X-Y索引附加到结果上,然后用剩余的数字重复上面的内容。

答案 5 :(得分:1)

数字的长度可能不同,因此将两者都转换为字符串,反向顺序(使索引更容易),使用扩展切片反向([:: - 1],Reverse a string in 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)

答案 6 :(得分:1)

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

>>> n1 = str(1646)
>>> n2 = str(2089)

然后我们可以添加相应的数字,然后执行%10以获取最后一位数字。添加两个整数 0-9 所产生的所有数字都将是&lt; = 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")添加不同长度的数字。