[B] PAT(3N + 1)の推定を続行

件名の説明:

Kharazi(Callatz)推測の説明は、1001に与えられています。このトピックでは、状況は多少複雑です。

ダブルカウントを避けるために、番号が遭遇した各再帰的に記録することができたとき、私たちはKharaziの推測を検証する場合。例えば、n = 3の場合は、検証のために、我々は、我々は、n = 5,8,4,2を確認する場合、3,5,8,4,2,1を計算する必要がある、それはKharazi推測直接決定することができます検証に遭遇したとき、それは数4 3を持っているので信憑性は、ダブルカウントせずに、我々は数の5,8,4,2 3「報道」と呼ばれています。私たちは、nは、シリーズの他の図でカバーすることができない場合は、「キーの数」の数であるn個の列に番号を呼び出します。

今検証する一連の番号に与えられた、我々は唯一のそれらのいくつかのキー番号を確認する必要がある、あなたは残りの番号を確認するために繰り返されている必要はありません。あなたの仕事は降順に出力することによると、これらのキー数値を見つけることです。

入力フォーマット:

N(1 <n≤100)各テストは、テスト入力を含む正の整数値は、最初の行がKの整数正が与えられる(<100)、2行目は検証する互いにKの別を与えます、数字間のスペースで区切られました。

出力フォーマット:

出力キー数値の順にライン毎の各テストケース出力、。数字の間の空間によって分離されたが、スペースを含まない行の後、最後の番号。

サンプル入力:

6
3 5 6 7 8 11

出力例:

7 6

問題解決のアイデア:

この質問は、最初の質問に似ています

コード:

#include<iostream>
#include<algorithm>
using namespace std;
int main() {
    int a[101]={0},h[10000]={0};
    int n,x,num=0;
    cin>>n;
    for(int i=0;i<n;i++) {
        cin>>a[i];
        x=a[i];
        if(h[x]==1) {
            continue;
        }
        while(x>1) {
            if(x%2==0) {
                x=x/2;
            } else {
                x=(3*x+1)/2;
            }
            h[x]=1;
        }
    }
    sort(a,a+n);
    for(int i=n-1;i>=0;i--) {
        if(h[a[i]]==0) {
            num++;
            if(num>1)
                cout<<" ";
            cout<<a[i];
        }
    }
    return 0;
}
公開された55元の記事 ウォン称賛30 ビュー9809

おすすめ

転載: blog.csdn.net/chaifang0620/article/details/104913674