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

来源:互联网 发布:淘宝店铺身份认证复核 编辑:程序博客网 时间:2024/06/16 05:35

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
原创粉丝点击