【问题标题】:Position Digits Sum (Sum of digits in two numbers based on their position)Position Digits Sum(基于位置的两个数字的数字总和)
【发布时间】:2017-10-22 09:49:00
【问题描述】:

我在一个网站上做一个练习题,但在某个点上卡住了。

问题是:

位置数字总和

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

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

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

边界条件:1

示例输入/输出 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代码,这使得它太长了。 我检查了但没有得到它有什么问题。有什么帮助吗?

【问题讨论】:

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


    【解决方案1】:

    可以使用 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
      

    【讨论】:

    • 一开始我也犯了同样的错误(当我使用zip_longest,然后切换到zfill)。但是zip_longest 仍然很好,如果你像最后一样颠倒数字。
    • @Jean-FrançoisFabre 我的“+1”已经在那里了。并感谢您首先纠正我。
    • 我的“+1”也可以为您提供答案,因为它是单线并使用itertools.zip_longest
    【解决方案2】:

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

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

    例如,您在迭代 y 时更改它。

    我,我会拆分,然后首先计算最长的整数,到零填充值,然后将数字交织在一起(但从末尾开始,因此是反向操作)求和并转换回字符串以传递给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)
    

    结果:

    13 13 10 2 1
    

    【讨论】:

      【解决方案3】:

      导入 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 + " ");
      }
      

      }

      }

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

      【讨论】:

        猜你喜欢
        • 2013-10-07
        • 2016-04-12
        • 2017-04-17
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        • 2020-01-25
        • 1970-01-01
        相关资源
        最近更新 更多