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乙级1005:继续(3n+1)猜想 (25)

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

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

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

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

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

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

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

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

1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B ...
  • bin8632
  • bin8632
  • 2015年12月08日 17:29
  • 325

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

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

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

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

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

1005. 继续(3n+1)猜想 (25)//code by indere 2017/6/16 malloc() calloc()

1005. 继续(3n+1)猜想 (25)——做题纪录

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

PAT 1005. 继续(3n+1)猜想 (25) ;JAVA实现

1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1005. 继续(3n+1)猜想 (25)
举报原因:
原因补充:

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