zoukankan      html  css  js  c++  java
  • PAT (Basic Level) Practice (中文)1005 继续(3n+1)猜想 (25 分)

    题目

    卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。

    当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 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

    C++实现

    /*
     * 思路:
     * 题解:如果 n 不能被数列中的其他数字所覆盖,称一个数列中的某个数 n 为“关键数”。
     * 1.输入一个数,将这个数能覆盖的数标记为true
     * 2.将所有的数遍历
     */
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    bool array[10000];
    bool cmp(int a,int b)
    {
        return a>b;
    }
    int main()
    {
        int n;
        cin>>n;
        vector<int> v(n);
        for (int i = 0; i < n; ++i) {
            int k;
            cin>>k;
            v[i]=k;
            while (k!=1)
            {
                if (k%2!=0) k=3*k+1;
                k/=2;
                if (array[k]) break;
                array[k]= true;
    
            }
        }
        bool falg= false;
        sort(v.begin(),v.end(),cmp);
        for (int j = 0; j < v.size(); ++j) {
            if (!array[v[j]])
            {
                if (falg== true)
                    cout<<' ';
                cout<<v[j];
                falg=true;
            }
        }
        return 0;
    }
    

    python实现

    def text(a):
        if(a%2==0):
            a=a/2
        elif(a%2!=0):
            a=(3*a+1)/2
        return a
    
    
    n=input()
    m=input().split()
    for i in range(len(m)):
        m[i]=int(m[i])
    
    result=m[0:len(m)]
    for i in m:
        a=i
        while a>1:
            a=text(a)
            if(a in result):
                result.remove(a)
    result.sort(reverse=True)
    if(len(result)==1):
        print(result[0],end='')
    else:
        for i in range(len(result)-1):
            print(result[i],end=' ')
        print(result[i+1],end='')
    
  • 相关阅读:
    出现org.apache.ibatis.binding.BindingException异常
    EasyExcel读写操作
    window下运行nginx出现nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
    vue Module build failed: Error: Missing binding E:vuevue-demo ode_modules ode-sa ssvendorwin64
    Axios谷粒学院学习
    springboot中数据库的连接
    多表删除,删除一个表的同时删除中间表
    今天写了一个SSM小项目,运行之后,前端页面的CSS、js样式显示不出来,具体操作如下:
    Java中Iterator(迭代器)实现原理
    写一些东西,记录一下成长的过程
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12338504.html
Copyright © 2011-2022 走看看