-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();
        }
    }

}

我如何集成一个循环给我第三行和行之间的所有排列?谢谢你的帮助

4

2 回答 2

0

我找到了这个解决方案:
按您不想要的所有值和掩码值循环所有三行:
if (((k & j) == 0) && ((k & i) == 0) && ((j & i) = = 0) && (k^j^i)==max)
这意味着:一个位置的位必须仅在一行中设置,并且行一起必须设置所有位

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 回答
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 回答