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

原创 2015年11月20日 20:43:57

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

//温故知新,修改于2016.7.30
#include<iostream>
#include<vector>
#include<functional>
#include<algorithm>
using namespace std;
int main()
{
    int hashNum[101]={0};
    int count;
    cin>>count;
    vector<int> nums;
    while(count--){
        int num;
        cin>>num;
        nums.push_back(num);
        hashNum[num]=1;
    }
    vector<int> result;
    for(auto num : nums){
        if(hashNum[num]==0)
            continue;
        while(num!=1)
        {
            num=(num%2==0)?num/2:(num*3+1)/2;
            if(num<=100)
                hashNum[num]=0;
        }
    }
    for(auto num : nums)
        if(hashNum[num]!=0)
            result.push_back(num);
    sort(result.begin(),result.end(),greater<int>());
    for(int i=0;i<result.size();i++)
        if(i!=(result.size()-1))
            cout<<result[i]<<" ";
        else
            cout<<result[i]<<endl;
    return 0;
}

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> program(int data)
{
    vector<int> datas;
    while(data!=1)
    {
        if(data%2==0)
        {
            data=data/2;
            datas.push_back(data);
        }
        else
        {
            data=(3*data+1)/2;
            datas.push_back(data);
        }
    }
    return datas;
}//这个函数主要是对每个数进行检查,然后返还其测试序列
bool ifExist(int data,vector<int> queue)
{
    for(vector<int>::iterator it=queue.begin();it!=queue.end();it++)
    {
        if (data==*it)
            return true;
    }
    return false;
}//这个函数主要是检查某个数是否在队列中
int main()
{
    cout<<"please input the data based on the rules"<<endl;
    int num;
    cin>>num;
    vector<int> datas;
    for(int i=0;i<num;i++)
    {
        int data;
        cin>>data;
        datas.push_back(data);
    }
    vector<int> notKey;
    for(vector<int>::iterator it=datas.begin();it!=datas.end();it++)
    {
        vector<int> queue=program(*it);//对测试序列的每个数进行测试,得到其测试序列
        for(vector<int>::iterator jt=queue.begin();jt!=queue.end();jt++)
        {
                if(ifExist(*jt,datas)&&!ifExist(*jt,notKey))
                {
                    notKey.push_back(*jt);
                }   
        }
    }
    vector<int> keyNum;
    for(vector<int>::iterator jt=datas.begin();jt!=datas.end();jt++)    
    {
        if(!ifExist(*jt,notKey))

            keyNum.push_back(*jt);      
    }

    sort(keyNum.begin(),keyNum.end(),greater<int>());
    for(vector<int>::iterator it=keyNum.begin();it!=(keyNum.end()-1);it++)
    {
        cout<<*it<<" ";
    }
    cout<<*(keyNum.end()-1)<<endl;

}



版权声明:本文为博主原创文章,未经博主允许不得转载。

PAT Basic 1005. 继续(3n+1)猜想 (25)(C语言实现)

题目 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证...
  • Oliver__Lew
  • Oliver__Lew
  • 2017年05月18日 23:44
  • 1070

编程题目:PAT 1005. 继续(3n+1)猜想 (25)

题目描述如下
  • zhangyalin1992
  • zhangyalin1992
  • 2014年07月01日 18:18
  • 1026

浙江大学PAT上机题解析之1005. 继续(3n+1)猜想 (25)

浙江大学PAT机试题
  • chenglechao
  • chenglechao
  • 2013年08月30日 08:57
  • 4032

1005. 继续(3n+1)猜想 (25) PAT乙级真题

1005. 继续(3n+1)猜想 (25) 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递...
  • liuchuo
  • liuchuo
  • 2016年07月22日 14:55
  • 677

浙江大学PAT_乙级_1005. 继续(3n+1)猜想 (25)

c++ list 实现
  • pythontojava
  • pythontojava
  • 2015年05月03日 14:18
  • 462

编程题目:PAT 1005. 继续(3n+1)猜想 (25)

题目描述如下
  • zhangyalin1992
  • zhangyalin1992
  • 2014年07月01日 18:18
  • 1026

【PAT】(乙级)1005. 继续(3n+1)猜想 (25)

1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 一、题目卡拉兹(Cal...
  • R3lish
  • R3lish
  • 2016年08月07日 12:34
  • 280

pat 乙级 1005 继续(3n+1)猜想 (25)

题目1005.继续(3n+1)猜想 (25)卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇...
  • xuanhuameiying
  • xuanhuameiying
  • 2016年08月27日 23:13
  • 156

PAT_1005. 继续(3n+1)猜想 (25) C++解答

当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接...
  • kwongyc
  • kwongyc
  • 2017年04月10日 22:22
  • 97

1005. 继续(3n+1)猜想 (25)(java实现)

题外话,感觉自己写的最好程序之一了,本来用数组分步骤什么的感觉一头雾水,然后灵光乍现,直接边计算边比较,然后又是的第一次用list(新手),感觉list对于不确定长度的一列数很好用。很有成就感,继续加...
  • cswoniu111
  • cswoniu111
  • 2017年03月27日 22:37
  • 194
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1005. 继续(3n+1)猜想 (25)
举报原因:
原因补充:

(最多只允许输入30个字)