PATグレード1024回文数(25分)(多数のほか、この数は始まる回文配列ではない考えます)

1024回文数(25分)
 

それは前後に書き込まれたときと同じであろう数は回文数として知られています。たとえば、1234321は回文数です。すべて1桁の数は回文数です。

非回文数は、一連の操作を経てパリンドロームのものとペアにすることができます。まず、非回文数が反転され、その結果が元の数値に加算されます。結果は回文数ではない場合、それは回文数を与えるまで、これが繰り返されます。67 + 76 = 143、および143 + 341 = 484:私たちは67から開始した場合、我々は2つのステップで回文数を取得することができます。

任意の正の整数を考えると  N、あなたはそのペア回文数とそれを見つけるために歩数を見つけることになっています。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各ケースは、2つの正の数字で構成さ  Nおよび  K、  N(≤)が初期NUMERであり、  K(≤)はステップの最大数です。数値は、スペースで区切られます。

出力仕様:

各テストケースのために、出力二つの数、各ラインに1。最初の数字は、一対の回文数であり、  N、及び第二の数は回文数を見つけるために取られるステップの数です。回文数が後に発見されない場合は  Kステップ、ちょうど出力で得られる数  K番目のステップと  Kinstead。

サンプル入力1:

67 3

サンプル出力1:

484
2

サンプル入力2:

69 3

サンプル出力2:

1353
3

ソリューション:

  念のため、多数の追加と当初を考えます。最初の提出は3列はつまり、K = 0、無しパリンドロームである前理由の独自の分析があったかもしれない見ていない2つのテストポイントとテストポイントを発見し、一桁のパリンドローム列があります。

5  100 
5 
0
131  500 
131

  このタイトルは、追加の数を調査し、逆に、これは簡単な質問が、知識のテストタルソ和の性質に属しています。多数のリードを追加しないと、テストポイント6,8テストポイント(0から始まる)が採用されていないと指摘しました。その理由は、Nレンジ(0,1010]、kの範囲は(0、100]は、我々はNがまだ不十分ステップ動作値回文た非常に近似し1010の値と100であると仮定すると、最悪の場合に、この問題を検討されていますさ、単に最大計算推定値は、範囲を示す長い長いINT(263-1、* 1018約9.2)を超えることが必要char値格納された番号であり、* 1010 2100で遭遇するものと理解されます。

ACコード:

#include <ビット/ STDC ++ H.>
 使用して 名前空間STD;
 char型 [ 101 ];
 CHAR B [ 101 ];
 チャー C [ 101 ];
 int型N-;
 int型のmain(){ 
    CIN >> A; 
    CIN >> N-、
     INT = L STRLEN(A)
     のためのint型 I = 0 ; Iは、Lを<; Iは++ ){ 
        B [I] = A [LI- 1 ]; 
    } 
    // 世代0をチェックパリンドローム自体ない
    INT = F 1 ; 
     int型半ば=(1- 1)/ 2 int型 J = 0 ; J <=半ばあり、j ++ ){
         場合([J] = [lj-!1 {])
            F = 0 破ります; 
        } 
    } 
    もし、(F){ 
        COUT << << ENDL。
        coutの << 0 ; 
    } 
     { // 再考虑第1代及以后
        INT K = - 1 int型 iは= 1、I ++; iが<= N。){
             // 新しい値加算
            INT X = 0 ;
             のためにINT J = 0 ; J <L; J ++ ){ 
                X = A [J] - ' 0 ' + B [J] - ' 0 ' + X; 
                C [J]のX%= 10 +を' 0 ' ; 
                X = X / 10 ; 
            } 
            IF(X> 0 ){ 
                C [L ++] = X + ' 0 '
            } 
            // 要件を満たしていない文字を確認 
            MID =(L- 1)/ 2 ; 
            Fの = 1 ;
             のためのINT J = 0 ; J <= MID; J ++ ){
                 IF!(C [J] = C [lj- 。1 ]){ 
                    F = 0 ;
                     BREAK ; 
                } 
            } 
            IF(F){ // パリンドローム 
                K = I;
                 BREAK ; 
            } 
            ためINT= J ENDL。0 ; J <L; J ++){ // 更新 
                A [J] = C [J]、
                B [J] = C [lj- 1 ]; 
            }          
        } 
        のためのINT I = L- 1。 ; I> = 0。 I - ){ // 出力 
            COUT << C [I]; 
        } 
        COUT << ENDL;
         IF(K =! - 1。){ // ないN世代まで 
            COUT << K << ENDL; 
        } {      
            COUT << << N-
        }     
    } 
    戻り 0 
}

 

 

他の人々あまりにも簡潔なコードについてはこちらをご覧ください:

書式#include <iostreamの> 
の#include <アルゴリズム>
 使用して 名前空間はstdを、
文字列は、(追加文字列A){
     ストリング ANS = 
    逆(a.begin()、a.end())。
    int型 I = a.length() - 1、=追加0 一方(I> = 0 ){
         int型 TMP = [I] - ' 0 ' + ANS [I] - ' 0 ' 
        ANS [I] =(+ TMPを追加)%10 + ' 0 ' 
        追加 =(TMP +追加)/ 10; 
        I - ; 
    } 
    であれば(追加)ans.insert(0" 1 " )。
    戻るANSを。
} 
int型のmain(){
     ストリングS。
    int型のk; 
    CIN >> S >> K;
    文字列 TMP =のS; 
    逆(tmp.begin()、tmp.end())。
    もし(TMP == S)COUT << TMP << ENDL << 0 他の{
         int型のI = 0 ;
        一方、(I < K){ 
            S = (TMP)を加えます。
            I ++ ; 
            TMP = S; 
            逆(tmp.begin()、tmp.end())。
            もし(TMP == S)ブレーク
        } 
        COUT << S << ENDL << I。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/caiyishuai/p/11360919.html