分析:定义标记数组,初始化为false,给定数据标记为true。验证过程中设计数据全部标记为false,最后标记为true的数据为最后答案。

#include <iostream>
#include <algorithm>
using namespace std;
bool flag[1024];
int num[512];
int res[128];
void Initial(){//初始化将所有的数标记为false
    for(int i=0; i<1024; i++){
        flag[i] = false;
    }
}
void Callatz(int a){//验证卡拉兹猜想
    while(a!=1){
        a=(a%2==0)?(a/2):(3*a+1)/2;
        flag[a] = false;//验证过程中的数标记为false
    }
}
int main()
{
    int n;
    cin>>n;
    Initial();
    for(int i=0; i<n; i++){
        cin>>num[i];
        flag[num[i]] = true;//输入数据全部标记为true
    }

    for(int i=0; i<n; i++){
        int var = num[i];
        if(flag[var]){
            Callatz(var);
        }
    }

    int ind = 0;

    sort(num, num+n);
    for(int i=0; i<n; i++){//标记为true的数据即欲输出数据
        if(flag[num[i]]){
            res[ind++] = num[i];
        }
    }

    for(int i=ind-1; i>=0; i--){
        cout<<res[i]<<(i!=0?" ":"\n");
    }
    return 0;
}

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐