咕咕咕咕7 2023-10-11 00:45 采纳率: 100%
浏览 22
已结题

浙江大学PAT 1005

题目

(出自浙江大学PAT 1005)
卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3 5 8 4 2 1,则当我们对 n=5 8 4 2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5 8 4 2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖。

现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

输入格式:

每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<100),第 2 行给出 K 个互不相同的待验证的正整数 n (1<n≤100)的值,数字间用空格隔开。

输出格式:

每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。

输入样例:

6
3 5 6 7 8 11

输出样例:

7 6

我的问题:

对于某些输入,报错 非0返回(我不知道那些输入是什么)。我知晓有更优解,但我没想通这个答案到底为什么不能解决题目,问题出在哪里。求解答。以下是我的答案

我的答案:

a = int(input())
b = list(map(int, input().split(" ")))
c = [0] * 101
d = []

def f(n):
    while (n != 1):
        if n % 2 == 1:
            n = (n * 3 + 1) // 2
        else:
            n = n // 2
        c[int(n)] = 0

for i in b:
    c[i] = 1

for j in b:
    if (c[j] == 1):
        f(j)

for k in b:
    if c[k] == 1:
        d.append(k)

d.sort(reverse=True)
print(' '.join(map(str, d)))
  • 写回答

8条回答 默认 最新

  • 失去的十年 2023-10-11 06:50
    关注
    a = int(input())
    b = list(map(int, input().split(" "))) #range(2,100)
    c = [0] * 101
    d = []
    def f(n):
        while (n != 1):
            if n % 2 == 1:
                n = (n * 3 + 1) // 2
            else:
                n = n // 2
            if(n<=100)
                c[int(n)] = 0
    for i in b:
        c[i] = 1
    
    for j in b:
        if (c[j] == 1):
            f(j)
    
    for k in b:
        if c[k] == 1:
            d.append(k)
    
    d.sort(reverse=True)
    print(' '.join(map(str, d)))
    

    算法没有太大问题,就是需要考虑边界问题,c数组开的太小了越界了,其实这个题目C数组也不用开太大,因为超过的部分不算关键字,可以不纳入计算中,直接<数组大小应该就可以了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 10月19日
  • 已采纳回答 10月11日
  • 创建了问题 10月11日