位数数字总和(基于位置的两位数字的总和)

时间:2017-10-22 09:49:00

标签: python python-2.7 python-3.x

我正在网站上处理练习问题并且陷入困境。

问题是:

  

职位数字总和

     

程序必须接受两个正整数作为输入然后   打印单位数字的总和,第十位数等等。

     

输入格式:第一行包含A和B,用a分隔   空间。

     

输出格式:第一行将包含单位数字的总和,   第十位数字,依此类推,值以空格分隔。

     

边界条件:1< = A,B< = 9999999

     

示例输入/输出1:输入:23 49

     

输出:12 6

     

示例输入/输出2:输入:12456 687

     

输出:13 13 10 2 1

好吧我解决了这个问题,但是6个测试用例(隐藏)中有5个案例通过,1个没有通过。

这是我的代码:

a,b = input().split()
assert 1<=len(a)<=7 and 1<=len(b)<=7
assert a.isdigit() == True and b.isdigit() == True
if len(a)>1 and len(b)>1:
    assert a[0] != '0' and b[0] != '0'
h = []
m = []
def pp(a,b):
    c = []
    for i in range(1,len(a)+1):
        x = int(a[-i])+int(b[-i])
        c.append(x)
    return c
if len(a)==len(b):
    g = pp(a,b)
    y = [str(i) for i in g]
    for i in range(0,len(y)-1):
        y[0] = y[0]+' '+y[1]
        y.remove(y[1])
    print(y[0])
if len(a)>len(b):
    d = abs(len(a)-len(b))
    for i in range(0,d):
        h.append(a[i])
        r = a.replace(a[0:d],'')
    p = pp(r,b)
    p = p+h[::-1]
    t = [str(i) for i in p]
    for i in range(0,len(t)-1):
        t[0] = t[0]+' '+t[1]
        t.remove(t[1])
    print(t[0])
if len(a)<len(b):
    d = abs(len(a)-len(b))
    for i in range(0,d):
        m.append(b[i])
        u = b.replace(b[0:d],'')
    q = pp(a,u)
    q = q + m[::-1]
    e = [str(i) for i in q]
    for i in range(0,len(e)-1):
        e[0] = e[0]+' '+e[1]
        e.remove(e[1])
    print(e[0])

我是初学者,所以我只使用简单的python代码,这使得它太长了。 我检查过但没有弄错。有什么帮助吗?

3 个答案:

答案 0 :(得分:2)

可以使用Python 3.x中的itertools.zip_longest()(在Python 2.7中相当于itertools.izip_longest())以非常简单的方式完成:

>>> from itertools import zip_longest
>>> a = 123
>>> b = 67891

>>> [sum(map(int, x))for x in zip_longest(str(a)[::-1], str(b)[::-1], fillvalue=0)]
[4, 11, 9, 7, 6]

说明:步骤到步骤中间导致上述列表理解表达式:

  1. int类型转换为str,以使其可迭代。反转两个迭代,以便它们可以与正确的10次幂并行迭代(下一步需要)。

    >>> str(a)[::-1]
    '321'
    
  2. 然后将它们与zip_longest一起使用,以便并行迭代这两个迭代。例如:

    >>> list(zip_longest(str(a)[::-1], str(b)[::-1], fillvalue=0))
    [('3', '1'), ('2', '9'), ('1', '8'), (0, '7'), (0, '6')]
    
  3. 使用map,将上述子列表中的每个字符串值输入回int作为:

    >>> list(map(int, ('3', '1')))
    [3, 1]
    
  4. 然后,使用sum,在上面的列表中添加了值:

    >>> sum([3, 1])
    4
    

答案 1 :(得分:2)

我没有深入分析您的代码,但它包含无效的结构,如:

for i in range(0,len(y)-1):
    y[0] = y[0]+' '+y[1]
    y.remove(y[1])
例如,

这里你在迭代它时改变y

我,我会拆分,然后先计算最长整数,零填充值,然后将数字交错(但从结束开始,因此反向运算)求和并转换回字符串传递给{{1 }}

join

结果:

import itertools

s = "12456 687"

numbers = s.split()
max_digit = max(len(x) for x in numbers)
numbers = [x.zfill(max_digit) for x in numbers]

# at this point: numbers = ['12456', '00687']

v = " ".join(reversed([str(int(a)+int(b)) for a,b in zip(*numbers)]))
print(v)

答案 2 :(得分:0)

import java.util。*;

公共课你好 { public static void main(String [] args)

{

//您的代码

Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int b = scan.nextInt();
int d1,d2,digit;
while(a>0 || b>0)
{
    d1 = a%10;
    d2 = b%10;
    digit = d1+d2;
    a = a/10;
    b = b/10;
    System.out.print(digit + " ");
}

}

}

这是位置数字和的正确代码