ちょっとわかりにくいタイトルですみません、どう表現すればいいのかわかりません。
文字セットのあらゆる可能な順列を可能にする char 配列を作成する必要があります。
私があなたに与えるとしたら:
char[] charSet = {"a", "b", "c"};
BigInteger value = n; //where n is a number >= 0
char[] charArray = createCharArray(value, charSet);
実行した場合、値とcharSetからcharArrayを作成するにはどうすればよいですか:
createCharArray(new BigInteger("6"), {"a", "b", "c"});
{"a", "c"} を返すため、
- a=1
- b=2
- c=3
- aa=4
- ab=5
- ac=6
これが私がこれまでに持っているものです:
private char[] createCharArray(BigInteger value, char[] charSet){
List<Character> charArray = new ArrayList<Character>();
if (value.compareTo(this.max) == 0)
System.out.println("");
BigInteger csSize = new BigInteger(String.valueOf(charSet.length));
if(this.powers.isEmpty())
this.powers.add(0, csSize.pow(0));
if(this.sumPowers.isEmpty())
this.sumPowers.add(0, csSize.pow(0));
BigInteger curPow;
int i = 1;
while((curPow = csSize.pow(i)).compareTo(value) <= -1){
if(this.powers.size() <= i)
this.powers.add(i, curPow);
if(this.sumPowers.size() <= i)
this.sumPowers.add(i, this.sumPowers.get(i-1).add(curPow));
i += 1;
}
i -= 1;
while (i >= 0 && value.compareTo(BigInteger.ZERO) >= 0){
if (i <= 1){
int charNum = value.divide(this.sumPowers.get(0)).intValue() - 1;
charArray.add(charSet[charNum]);
}
else{
int charNum = value.divide(this.sumPowers.get(i-1).subtract(BigInteger.ONE)).intValue() - 1;
charArray.add(charSet[charNum]);
}
value = value.subtract(this.powers.get(i));
i -= 1;
}
char[] returnArray = new char[charArray.size()];
int j = 0;
while(j<charArray.size()){
returnArray[j] = charArray.get(j);
j += 1;
}
return returnArray;
}
値が 0 の場合は失敗し、値が 1 と 2 の場合は成功し、3 ~ 8 の場合は失敗し、9 と 10 の場合は成功するなど、確かに何らかの助けが必要です。
編集: 明確にするために、値パラメーターは n > 0 の任意の数にすることができる必要があります。これが、BigInteger を選択した理由です。