题目的详细要求看这里:http://www.spoj.com/problems/ARITH/
觉得看英文麻烦的可以看这里:http://blog.csdn.net/tiaotiaoyly/article/details/2087975
看时间是一道很老的题目,但是网上资料并不多,而且根据第二个链接我注意的地方都注意了,但是仍然WA,实在是要睡觉了,所以交给诸位网友啦~
下面是源码(如果你忍心看的话)
def Add(a, b):
l = []
alen = len(a)
blen = len(b)
result = str(int(a) + int(b))
relen = len(result)
llen = alen > blen and alen or blen+1
llen = relen > llen and relen or llen
l.append(' ' * (llen - alen) + a)
l.append(' ' * (llen - blen - 1) + '+' + b)
l.append('-' * llen)
l.append(' ' * (llen - relen) + result)
List.append(l)
def Sub(a, b):
l = []
alen = len(a)
blen = len(b)
result = str(int(a) - int(b))
relen = len(result)
llen = alen > blen and alen or blen+1
l.append(' ' * (llen - alen) + a)
l.append(' ' * (llen - blen - 1) + '-' + b)
l.append('-' * llen)
l.append(' ' * (llen - relen) + result)
List.append(l)
def Multi(a, b):
l = []
alen = len(a)
blen = len(b)
result = str(int(a) * int(b))
relen = len(result)
llen = relen > blen+1 and relen or blen+1
_len_bove = alen > blen and alen or blen+1
_len_below = len(str(int(a) * int(b[-1])))
_len = _len_bove > _len_below and _len_bove or _len_below
l.append(' ' * (llen - alen) + a)
l.append(' ' * (llen - blen - 1) + '*' + b)
l.append(' ' * (llen - _len) + '-' * _len)
for i in range(blen):
cpt = str(int(a) * int(b[-i-1]))
l.append(' ' * (llen - len(cpt) - i) + cpt)
if blen != 1:
l.append('-' * llen)
l.append(' ' * (llen - relen) + result)
List.append(l)
n = input()
List = []
for i in range(n):
string = raw_input()
if '+' in string:
a, b = string.split('+')
Add(a, b)
elif '-' in string:
a, b = string.split('-')
Sub(a, b)
elif '*' in string:
a, b = string.split('*')
Multi(a, b)
for l in List:
for i in l:
print i
print
再次自问自答,我以为都注意到了的问题,经过测试才发现被忽略了。
测试集用的下面的链接(真的很有代表性哦!)
http://contest.felk.cvut.cz/00cerc/solved/arith.in
http://contest.felk.cvut.cz/00cerc/solved/arith.out
(终于知道为什么这道题AC率这么低了!改了十几次都是小地方没注意到有木有!)
说明一下我没有注意到的问题:
1.减法的破折号长度取决于第二个操作数和结果数,并非是操作数和结果数的最大值。
2.乘法的结果数上破折号的长度仅取决于它自己,不一定和第一个破折号长度相等。
其实CSDN那篇博客已经要把所有注意到的点都说出来了,但是你要确定你在每个细节都注意到了。
这个题的示例格式很有误导性,没有表现出它不同于常规算式的地方,仅仅是在繁琐的文字描述里表述出来了。
有些人可能觉得这种题目很扯淡,但是小白我觉得在平常工作中我们不也经常在这种“毫无意义”“扯淡”的地方掉坑里吗?
所以,注意好所有的细节,并且培养自己处理大量细节的能力,也是挺重要的。