[7-10] PTA列の最後から二番目のN

タイトルリピート

完全配列を増加小文字からなる文字列演算与え、シーケンス内の各列は1の増分で、L aから出発して、Lに固定されています。例えば、Lが3である場合、シーケンス{AAA、AAB、AAC、...、AAZ、ABA、ABB、...、ABZ、...、ZZZ}。最後から二番目の27文字列の順序はzyzです。任意のLでは、この問題は、対応するN最後から二番目の列の文字列を与える必要があります。

入力フォーマット:

指定された入力列2つの正の整数L(2≤L≤6)及びN(≦10
。5
)。

出力フォーマット:

行の最後から二番目のN列の出力配列に対応します。トピックは、この文字列が存在することを確認してください。

サンプル入力:

3 7417

出力例:

pat

問題の解決策

実際には、これは26進の問題です。

  • 彼は他に希望がそれらを判断する場合には半日の強度を費やし、これは理論的には面倒でエラーが発生しやすく、できることがわかったので、唯一のL 2-6から考慮すると、これが最も簡単な方法も可能です。

  • 我々はascllコードの契約のためにそれに対処することができるので、我々としても、文字で、数字のトラブル取引の多くを座って、それについて考えるかもしれません。

  • まず、L桁が全体的な可能性の高いシナリオは26であると判断Lのトピックの種類の相互N番目の番号が最初に正26なければならないので、作るL時間のN個の入金され、Xが-

  • L =ここに知って最初の数字(おそらくビットの残り数からなる)X / +「」は、その文字( '+ 1)=「B」であります

  • 上記に干渉しないために、X =(残りのビットは、構成されてもよい)、Xモジュロの
    ビットの第2ビット= X / Lの数(残り可能となるビット数)+「A」

以下のように...

100 ++と

#include <iostream>

using namespace std;

int main()
{
    char str[15];

    int L,N;
    cin>>L>>N;
    int sum=1;
    //根据位数决定有多少种可能
    for(int i=0;i<L;i++)
    {
        sum*=26;
    }
    //倒数第N个,所以应该找的是第sum-N个
    sum-=N;

    //对于字符数组,从第一个开始访问,
    for(int i=L-1,j=0;i>=0;i--,j++)
    {
        int tmpsum=1;
        for(int k=0;k<i;k++)
        {
            tmpsum*=26;
        }

        //sum/剩下位数的可能 就是当前位应该填多少
        str[j]=sum/tmpsum+'a';
        //更新sum,以消除前面位数的影响
        sum=sum%tmpsum;

    }
    for(int i=0;i<L;i++)
    {
        cout<<str[i];
    }


    return 0;
}

公開された200元の記事 ウォン称賛99 ビュー40000 +

おすすめ

転載: blog.csdn.net/weixin_43889841/article/details/103996913
おすすめ