1005. 继续(3n+1)猜想(Python)

来源:互联网 发布:手机网络代理ip 编辑:程序博客网 时间:2024/06/14 06:19

背景

  • 在使用 Pyhton 解决 [PAT].1005 过程中,由于细节处理不当导致测试点 0、1、4 全部错误,最终仅得到 5 分!
  • 细节决定成败!

题目描述

  • 问题具体描述可以参考图 1-1,也可以点击这里查看原址。
    1005

解决思路 [NEW]

  • 返回计算中间值函数
  • 待验证的正整数 整体循环下,将当前待验证正整数集合与当前中间值集合去差集,然后重新赋值给当前待验证正整数集合
  • 格式化转换、排序、输出
  • 注意,将字符串类型的剩余正整数集合进行排序得到的结果是不正确的(数值排序)。

提交结果(5分)

'''1 返回覆盖集合'''def get_cover(nums):    tmp=[]    while True: # 失误,处理公式不正确        if nums==1:            break        nums=nums//2 if nums%2==0 else (nums*3+1)//2        tmp.append(nums)    return set(tmp)nums=int(input()) # 2 读入数据while nums: # 3 遍历计算覆盖值取差集    num_strs=input().split(' ')    result=set([int(num) for num in num_strs])    for num in num_strs:        covers=get_cover(int(num))        result=result.difference(covers)        nums-=1result=[str(val) for val in result]result.sort(reverse=True)print (' '.join(result))

提交结果(25分

def get_cover(nums): # 1 返回覆盖集合    tmp=[]    while True: # 失误,处理公式不正确        if nums==1:            tmp.append(1)            break        nums=nums//2 if nums%2==0 else (nums*3+1)//2        tmp.append(nums)    return set(tmp)nums=int(input()) # 2 读入数据while nums: # 3 遍历计算覆盖值取差集    num_strs=input().split(' ')    result=set([int(num) for num in num_strs])    for num in num_strs:        covers=get_cover(int(num))        result=result.difference(covers)        nums-=1result=list(result)result.sort(reverse=True)result=[str(val) for val in result]print (' '.join(result))

结果分析

  • 很明显,对比前后提交的代码也就只有最后 4 行代码有所不同。可见处理细节是多么重要!
  • 另外,一开始面对提交结果时,自己也比较困惑问题出在了哪里,搜索了一些答案,差不多都是小巫见大巫吧,几乎没有清晰、透彻的分析。

排查问题

  • 其实也不用多说,方法大家都(mai)知(guan)道(zi)。
  • 提交前
    • 多次测试!
    • 多次测试!
    • 多次测试!

e.g.

# 造测试案例import randomfor i in range(0,5):    ns=random.randint(1,30)    print (ns,' '.join([str(random.randint(1,100)) for i in range(0,ns)]))
# 测试数据集22  57 35 99 26 20 11 35 61 70 30 5 88 41 78 78 3 36 38 88 81 83 7130  28 25 49 86 97 70 43 62 18 48 88 29 59 21 34 10 7 83 55 34 57  56 93 63 9 84 54 50 5 35 4  81 27 4 6716  100 52 60 41 75 83 45 76 92 22 31 41 70 42 48 2712  98 25 30 3 46 14 33 96 15 40 36 29
  • 未提交前,可以使用合适数量的测试案例验证运行结果,然后再提交。
  • 提交后,可以参考别人正确的代码,进行运行结果对比,应该就能很快找到原因。

最终结果:

得分 用时(ms) 内存(kb) 25 24 3184
原创粉丝点击