0

ちょっとわかりにくいタイトルですみません、どう表現すればいいのかわかりません。

文字セットのあらゆる可能な順列を可能にする 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 を選択した理由です。

4

2 に答える 2

0

2つのフィールドを持つクラスを作成します。

private char letter;
private int value;
public <classname>(char letter){
this.letter = letter;
value = 0;
}
//Setters and getters

次に、メインで配列を初期化するときに(forループを介して)値をi + 1に設定します(0を削除します)

for(int i = 0; i < <yourarray>.length; i ++){
    //Assuming you initialized your objects before
    <yourarray>[i].<setterforvalue>(i + 1);
}

そして、それらを一緒に計算するには:

for(int i = 0; i < <yourarray>.length; i ++){
    for(int j = 0; j < <yourarray>.length; j ++){
     if(<yourarray>[i] + <yourarray>[j] == <needednumber>){
       //Do what you need to do with the value
     }
   }
}
于 2012-12-13T17:46:13.437 に答える
0

よく考えて、最終的には文字の代わりに 0 ~ 9 の数字を使用するように分解しました。内訳は次のとおりです。 通常の 10 進数がどのように作成されるかを考えてみてください。

194 という数字は、1 の桁の 4、10 の桁の 9、および 100 の桁の 1 で構成されています。1、10、100 の違いは、基数である 10 の掛け算/割り算です。

そこで、194 を基数 (10) で変更して、1 の 4 を取得できると考えました。次に、10 で割って 1 の列を削除します。再度 mod を実行して 9 を取得し、次に 10 で割り、再度 mod を実行して 1 を取得し、10 で除算します。除算によって正確に 0 の数値が作成されたら、完了です。これは、000194 という数字を作ることができないためです。

私の関数では、My base は文字セットの長さで、値は上記の例では 194 のようになります。

private static void createCharArray(BigInteger value, char[] charSet){
    List<Character> charArray = new ArrayList<Character>();

    BigInteger csSize = BigInteger.valueOf(charSet.length);

    if (value.compareTo(BigInteger.ZERO) == 0)
        charArray.add(0, charSet [0]);
    else{
        BigInteger modded = value.mod(csSize);
        BigInteger digit  = value.divide(csSize);

        while (modded.compareTo(BigInteger.ZERO) != 0 || digit.compareTo(BigInteger.ZERO) != 0){
            if(modded.compareTo(BigInteger.ZERO) == 0){
                charArray.add(0, charSet[csSize.subtract(BigInteger.ONE).intValue()]);
                value = value.subtract(BigInteger.ONE);
            }
            else
                charArray.add(0, charSet[modded.subtract(BigInteger.ONE).intValue()]);
            value = value.divide(csSize);

            modded = value.mod(csSize);
            digit  = value.divide(csSize);
        }
    }

    for(char c : charArray)
        System.out.print(c);
    System.out.println();


}

public static void main(String[] args) {
    long start = System.nanoTime();
    String characters = "";
    characters += "0123456789";
    characters += "abcdefghijklmnopqrstuvwxyz";
    characters += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    characters += " !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";

    char[] cs = characters.toCharArray();
    Arrays.sort(cs);

    createCharArray(new BigInteger("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"), cs);
    long total = System.nanoTime() - start;
    System.out.println("Completed in: " + total + " billionths of a second");
    System.out.println("Completed in: " + total/1000000 + " thousandth(s) of a second");
}  

これを実行すると、下から BigInteger の 4 行が 100 文字になることに注意してください。私のマシンでは、1/1000 秒 (1 ミリ秒) しかかかりません。

于 2012-12-14T04:23:56.667 に答える