我正在网站上处理练习问题并且陷入困境。
问题是:
职位数字总和
程序必须接受两个正整数作为输入然后 打印单位数字的总和,第十位数等等。
输入格式:第一行包含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代码,这使得它太长了。 我检查过但没有弄错。有什么帮助吗?
答案 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]
说明:步骤到步骤中间导致上述列表理解表达式:
将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
答案 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 + " ");
}
}
}
这是位置数字和的正确代码