1005 繼續(3n+1)猜想 (25分)

Github代碼(不全,更新中)

分析:定義標記數組,初始化爲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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章