9

学校の課題の一部として真理値表を印刷しようとしています。Java で動的サイズの真理値表を生成するにはどうすればよいですか?

したがって、次のようにprintTruthTable(1)出力されます。

0
1

printTruthTable(3)プリント:

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

等々。再帰を使用して実装しようとしていますが、うまくいきません。

4

8 に答える 8

16

これがあなたの問題についての私の見解です。すべてが少人数のクラスで素晴らしくタイトに書かれています。コピー/貼り付けするだけです。

modulo2(%記号)を使用してループインデックスから0と1を取得する方法に注目してください

public class TruthTable {
    private static void printTruthTable(int n) {
        int rows = (int) Math.pow(2,n);

        for (int i=0; i<rows; i++) {
            for (int j=n-1; j>=0; j--) {
                System.out.print((i/(int) Math.pow(2, j))%2 + " ");
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        printTruthTable(3); //enter any natural int
    }
}
于 2012-05-25T21:02:44.777 に答える
12

これは真理値表ではなく、2 進数の表です。Java のInteger.toBinaryStringメソッドを使用して、必要なゼロと 1 を生成できます。スペースの挿入は簡単です。

int n = 3;
for (int i = 0 ; i != (1<<n) ; i++) {
    String s = Integer.toBinaryString(i);
    while (s.length() != 3) {
        s = '0'+s;
    }
    System.out.println(s);
}
于 2012-05-23T15:31:25.367 に答える
2

再帰の魔法:

public static void main(String args[]) {
    int size = 3;
    generateTable(0, size, new int[size]);
}

private static void generateTable(int index, int size, int[] current) {
    if(index == size) { // generated a full "solution"
        for(int i = 0; i < size; i++) {
            System.out.print(current[i] + " ");
        }
        System.out.println();
    } else {
        for(int i = 0; i < 2; i++) {
            current[index] = i;
            generateTable(index + 1, size, current);
        }
    }
}
于 2012-05-23T15:34:08.780 に答える
1

生成しているものを見ると、バイナリでカウントしているように見えます。バイナリで 2^(n) - 1 までカウントし、ビットを吐き出します。

于 2012-05-23T15:31:22.043 に答える
0

真理値表は数値のバイナリ表現に基づいていますが、先頭のゼロを削除していないため、0 から (1<

public void  generate(int n){
    for (int i=0 ;i!=(1<<n);i++) {
        String binaryRep = Integer.toBinaryString(i);
        while (s.length() != n) {
            binaryRep = '0'+binaryRep;
        }
        System.out.println(s);
    }
}

再帰を使用してそれを行うこともできます:

public void generateRecursively(int i , int n){
    if(i==(1<<n))
        return;
    else{
        String temp = Integer.toBinaryString(i);
        while(temp.length()<n){
            temp = '0'+temp;
        }
        System.out.println(temp);
        generateRecursively(i+1,n);
    }
}
于 2014-05-16T20:02:23.340 に答える
0

あなたの問題をより長く理解する

import java.util.Scanner;
    public class tt{
        boolean arr[][];
        boolean b=false;
        boolean[][] printtt(int n){
            for(int i=0;i<n;i++){
                for(int j=0;j<(Math.pow(2,n));j++){

                        if(j<Math.pow(2,n-1)){
                            arr[j][i]=b;
                        }
                        else{
                            arr[j][i]=!b;
                        }
                }
                }
                return(arr);
            }


        public static void main(String args[]){
            Scanner sc=new Scanner(System.in);
            System.out.println("Input values count");
            tt ob=new tt();
            int num=sc.nextInt();int pownum=(int)Math.pow(2,num);
            boolean array[][]=new boolean[pownum][num];
            array=ob.printtt(num);
            for(int i=0;i<num;i++){
            for(int j=0;j<(Math.pow(2,num));j++){

                    System.out.println(array[j][i]);
                }
        }
    }
    }
于 2015-08-20T06:50:07.580 に答える