关闭

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

151人阅读 评论(0) 收藏 举报
分类:

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;

}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37539次
    • 积分:1695
    • 等级:
    • 排名:千里之外
    • 原创:122篇
    • 转载:5篇
    • 译文:0篇
    • 评论:11条
    最新评论