python - SPOJ Problem Set (classical) 6. Simple Arithmetics
PHP中文网
PHP中文网 2017-04-17 11:47:16
[Python讨论组]

题目的详细要求看这里: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 
PHP中文网
PHP中文网

认证高级PHP讲师

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号