SPOJ Problem Set (classical) 6. Simple Arithmetics

libraco
  • 760

题目的详细要求看这里: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 
回复
阅读 3.2k
1 个回答
✓ 已被采纳

再次自问自答,我以为都注意到了的问题,经过测试才发现被忽略了。
测试集用的下面的链接(真的很有代表性哦!)
http://contest.felk.cvut.cz/00cerc/solved/arith.in
http://contest.felk.cvut.cz/00cerc/solved/arith.out
(终于知道为什么这道题AC率这么低了!改了十几次都是小地方没注意到有木有!)

说明一下我没有注意到的问题:
1.减法的破折号长度取决于第二个操作数和结果数,并非是操作数和结果数的最大值。

1000
  -1
 ---
 999

2.乘法的结果数上破折号的长度仅取决于它自己,不一定和第一个破折号长度相等。

     1
*12345
------
     5
    4
   3
  2
 1
 -----
 12345

其实CSDN那篇博客已经要把所有注意到的点都说出来了,但是你要确定你在每个细节都注意到了。
这个题的示例格式很有误导性,没有表现出它不同于常规算式的地方,仅仅是在繁琐的文字描述里表述出来了。
有些人可能觉得这种题目很扯淡,但是小白我觉得在平常工作中我们不也经常在这种“毫无意义”“扯淡”的地方掉坑里吗?
所以,注意好所有的细节,并且培养自己处理大量细节的能力,也是挺重要的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进