[英]Position Digits Sum (Sum of digits in two numbers based on their position)
我在网站上处理一个练习问题,并陷入了困境。
问题是:
位置数字总和
程序必须接受两个正整数作为输入,然后打印它们的单位位数和十分位数的总和。
输入格式:第一行将包含A和B,并用空格分隔。
输出格式:第一行将包含单位数字和第十位数字的总和,以空格隔开。
边界条件: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代码,这使它太长了。 我检查了一下,但没弄明白有什么问题。 有什么帮助吗?
它可以在非常简单的使用方式来完成itertools.zip_longest()
在Python 3.X(相当于itertools.izip_longest()
在Python 2.7)为:
>>> 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]
说明:在上面的列表理解表达式中,逐步显示中间结果:
型铸造int
值str
,以使它们可迭代。 颠倒这两个可迭代对象,以便可以正确的10幂并行地进行迭代(在下一步中需要)。
>>> str(a)[::-1] '321'
然后将它们与zip_longest
一起使用,以并行地迭代两个可迭代对象。 例如:
>>> list(zip_longest(str(a)[::-1], str(b)[::-1], fillvalue=0)) [('3', '1'), ('2', '9'), ('1', '8'), (0, '7'), (0, '6')]
使用map
,将上述子列表中的每个字符串值类型转换为int
是:
>>> list(map(int, ('3', '1'))) [3, 1]
然后,使用sum
,在上面的列表中添加值:
>>> sum([3, 1]) 4
我没有深入分析您的代码,但其中包含无效的结构,如下所示:
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
导入java.util。*;
公共类你好{公共静态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 + " ");
}
}
}
这是位置数字总和的正确代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.