C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でのK桁のN番目の回文


k桁のn番目の回文を見つけるには、最初のk桁の番号から、n番目の回文番号が見つかるまで繰り返すことができます。このアプローチは効率的ではありません。自分で試すことができます。

それでは、k桁のn番目の回文を見つけるための効率的なアプローチを見てみましょう。

数字には2つの半分があります。前半は後半の逆に等しい。

k桁のn番目の数字の前半は

kが奇数の場合、(n-1)+ 10 k / 2 else(n-1)+10 k / 2-1

k桁のn番目の数値の後半は、前半の桁の逆になります。 kが奇数の場合は、数値の前半の最後の桁を切り捨てます。

アルゴリズム

  • 番号nとkを初期化します。
  • kの値を使用して、k桁の回文の前半の長さを見つけます。
  • 回文の前半はpow(10、length)+n-1です。
  • kが奇数の場合は、回文の前半から最後の桁を削除します。
  • 前半を反転して後半を印刷します。

実装

以下は、C++での上記のアルゴリズムの実装です

#include<bits/stdc++.h>
using namespace std;
void findNthPalindrome(int n, int k) {
   int temp = (k & 1) ? (k / 2) : (k / 2 - 1);
   int palindrome = (int)pow(10, temp);
   palindrome += n - 1;
   cout << palindrome;
   if (k & 1) {
      palindrome /= 10;
   }
   while (palindrome) {
      cout << palindrome % 10;
      palindrome /= 10;
   }
      cout << endl;
}
int main(){
   int n = 7, k = 8;
   findNthPalindrome(n ,k);
   return 0;
}

出力

上記のコードを実行すると、次の結果が得られます。

10066001

  1. C++での回文分割

    1つの入力文字列があるとします。パーティションのすべてのサブ文字列が回文である場合、その文字列の分割は回文分割です。このセクションでは、指定された文字列をパリンドロームで分割するために必要な最小限のカットを見つける必要があります。したがって、文字列が「ababbbabbababa」のような場合は、回文として分割するための最小カット。ここでは3つのカットが必要です。回文は次のとおりです。ババブ| b |アババ これを解決するには、次の手順に従います- n:=strの長さ それぞれ次数nxnのカット行列とパル行列を定義します for i:=0 to n、do pal [i、i]:=tr

  2. 数値がC++の回文であるかどうかを確認します

    ここでは、番号が回文であるかどうかを確認する方法を説明します。回文数は両方向で同じです。たとえば、番号12321は回文ですが、12345は回文ではありません。 ロジックは非常に単純です。数を逆にする必要があります。逆の数が実際の数と同じである場合、それは回文です。そうでない場合はそうではありません。より良いアイデアを得るためのアルゴリズムを見てみましょう。 アルゴリズム isPalindrome(n)- 入力 −数n 出力 −数値が回文の場合はtrue、それ以外の場合はfalse begin    temp := n    rev :=