タイトルリピート
完全配列を増加小文字からなる文字列演算与え、シーケンス内の各列は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;
}