-1

次の種類の 3 つの値のリストを作成したい (バイナリ表記!):

0;0;0  
1;0;0  
0;1;0  
11;0;0
10;1;0 
  .
  .
  . 
1111111111;0;0 
0;1111111111;0 
0;0;1111111111

およびその間のすべての欠損値

このリストの意味: すべての列にはすべての値 (順列?) が必要ですが、ビットが別の列に設定されていない場合のみ

これは、10 個のマーク可能なものを 3 つの異なるボックスに入れる問題です

私は3つのループを試しましたが、私はいつもそれを台無しにします:(それは私がこれまでに持っているものです:

import java.io.FileNotFoundException;
import java.math.BigInteger;

public class create_referencevalues {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Long[] list = { 10L, 40L, 90L, 160L, 250L, 350L, 500L, 650L,800L,1000L };

        try {
            java.io.PrintStream p = new java.io.PrintStream(
                    new java.io.BufferedOutputStream(
                            new java.io.FileOutputStream(new java.io.File(
                                    "C:/users/djdeejay/listall.csv"), false)));
            for (Integer i = 0; i < 1024; i++) {
                Long sum1 = 0L;
                for (Integer j = 0; j < 10; j++) {
                    if (BigInteger.valueOf(i).testBit(j)) {
                        sum1 += (list[j]);
                    }

                }
                sum1 *= Integer.bitCount(i);
                Long sum2 = 0L;
                for (int j = 0; j < 10; j++) {
                    if (BigInteger.valueOf(1023 - i).testBit(j)) {
                        sum2 += (list[j]);
                    }
                }
                sum2 *= 10-Integer.bitCount(i);

                p.println(i +";"+ Long.toBinaryString(i)+";" + sum1+";"+ Long.toBinaryString(1023-i)+";"+sum2);
            }

            p.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

}

3行目と行間のすべての順列を与えるループを統合するにはどうすればよいですか? 助けてくれてありがとう

4

2 に答える 2

0

これを試して :

public class Permutation {

    private static final int NB_DIGITS = 10;

    private int[] DIGIT_NUMBER = {1,10,100,1000,10000,100000,1000000,10000000,100000000, 1000000000};

    public void dump(PrintStream printStream) {
        int[] counter = new int[NB_DIGITS];
        Arrays.fill(counter, 0);
        do {
            int column1 = 0;
            int column2 = 0;
            int column3 = 0;

            for (int i = 0; i < NB_DIGITS; i++) {
                int columnIdx = counter[i];
                switch (columnIdx) {
                    case 0 : column1+=DIGIT_NUMBER[i];break;
                    case 1 : column2+=DIGIT_NUMBER[i];break;
                    case 2 : column3+=DIGIT_NUMBER[i];break;
                    default:
                        assert false;
                }

            }

            printStream.format("%d;%d;%d%n", column1, column2, column3);

        } while (increase(counter));
    }

    public boolean increase(int[] counter) {
        int idx = 0;
        while (idx < counter.length && counter[idx] == 2) {
            counter[idx] = 0;
            idx++;
        }

        if (idx == counter.length) {
            return false;
        }

        counter[idx]++;
        return true;
    }

    public static void main(String[] args) {
        new Permutation().dump(System.out);
    }
}

カウンター配列には、数字を配置する列インデックスが含まれています。これは実際には 0 と 3^10-1 の間の基数 3 の手動ループなので、すべての可能な位置に到達します。

于 2013-08-22T22:32:16.340 に答える
0

私はこの解決策を見つけました:
3行すべてをすべての値でループし、不要な値をマスクします:
if (((k & j) == 0) && ((k & i) == 0) && ((j & i) = = 0) && (k^j^i)==max)
つまり、ある位置のビットは 1 つの行でのみ設定する必要があり、行をまとめてすべてのビットを設定する必要があります

package com.djdeejay.cowTrade.client.standaloneplayer.application;

import java.io.FileNotFoundException;
import java.math.BigInteger;

public class create_referencevalues {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Long[] list = { 10L, 40L, 90L, 160L, 250L, 350L, 500L, 650L, 800L,
                1000L };

        try {
            java.io.PrintStream p = new java.io.PrintStream(
                    new java.io.BufferedOutputStream(
                            new java.io.FileOutputStream(new java.io.File(
                                    "C:/users/djdeejay/listall.csv"), false)));
            Long i = 0l;
            Long j = 0l;
            Long k = 0l;
            Long max = 1023L;
            Long count = 0l;
            for (i = 0l; i < max; i++) {
                for (j = 0l; j < max; j++) {
                    for (k = 0l; k < max; k++) {
                        String col1 = Long.toBinaryString(i);
                        String col2 = Long.toBinaryString(j);
                        String col3 = Long.toBinaryString(k);
                        if (((k & j) == 0) && ((k & i) == 0)
                                && ((j & i) == 0) && (k^j^i)==max) {
                            count++;
                            Long sum1 = 0L, sum2 = 0L, sum3 = 0L;
                            for (int x = 0; x < 10; x++) {
                                if (BigInteger.valueOf(i).testBit(x)) {
                                    sum1 += (list[x]);
                                }
                                if (BigInteger.valueOf(j).testBit(x)) {
                                    sum2 += (list[x]);
                                }
                                if (BigInteger.valueOf(k).testBit(x)) {
                                    sum3 += (list[x]);
                                }
                            }
                            sum1 *= Long.bitCount(i);
                            sum2 *= Long.bitCount(j);
                            sum3 *= Long.bitCount(k);
                            p.println(count + ";" + i + ";" + j + ";" + k);
                            System.out.println(count + ";" + col1 + ";" + col2 + ";" + col3);

                        }
                    }
                }
            }
            System.out.println(count + ";" + i + ";" + j + ";" + k);

            p.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}
于 2013-08-22T23:04:23.357 に答える