2013-08-22 59 views
-1

我想提出以下類型的3個值的列表(二進制記數法!):java:如何循環,我得到正好在3列3^10(分離)值?

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行的行之間的所有排列? 感謝您的幫助

+0

請詳細說明3列排列的含義。 –

+0

好的,我沒有想到確切的解決方案,但我可以告訴你,使用遞歸在這裏會很方便。雖然任何遞歸代碼都可以用循環結構編寫,但如果使用遞歸實現,仍然有些解決方案更優雅。在這方面你可能會想到解決方案。 –

+0

如果你想從一篇文章(或所有文章)中解除關聯,那麼你可以通過聯繫頁面來問這樣做:http://stackoverflow.com/contact不要只是用垃圾文字替換你的文章。 –

回答

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中手動循環,所以你達到了所有可能的位置。

+0

@djdeejay這更快,主要是因爲在你的解決方案中,你測試1024^3的組合並拒絕大多數組合(正如你所說的那樣只有3^10 = 59049有效組合)。在我的方法中,我只對有效的循環進行循環,所以迭代次數少(大約少於18000次)並且沒有測試。 –

+0

代碼的這種和平我真的是一顆寶石! – djdeejay

0

我發現這個解決方案:
循環中的所有三行乘你不所有值和屏蔽想:
如果(((K & j)的== 0)& &((K &我)== 0 )& &((j &ⅰ)== 0)& &(K^J 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(); 
     } 
    } 
}