【问题标题】:Generating truth tables in Java在 Java 中生成真值表
【发布时间】:2012-05-23 15:28:48
【问题描述】:

我正在尝试打印一些真值表作为学校作业的一部分。如何在 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

等等。我一直在尝试使用递归来实现它,但我就是做错了。

【问题讨论】:

    标签: java truthtable


    【解决方案1】:

    这是我对你的问题的看法,在一个小班上写得很好,很紧凑,只需复制/粘贴

    注意我如何使用模 2(% 符号)从循环索引中获取 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
        }
    }
    

    【讨论】:

      【解决方案2】:

      这不是一个真值表 - 相反,它是一个二进制数表。您可以使用Java 的Integer.toBinaryString 方法来生成您需要的0 和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);
      }
      

      【讨论】:

      • 要使其动态化,您应该将 s.length() != 3 替换为 s.length() != n
      【解决方案3】:

      递归的魔力:

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

      【讨论】:

        【解决方案4】:

        如果您查看正在生成的内容,它似乎是以二进制计数的。您将数到二进制的 2^(n) - 1 并吐出位。

        【讨论】:

          【解决方案5】:

          真值表基于数字的二进制表示,但不删除前导零 所以你要做的是从 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);
              }
          }
          

          【讨论】:

          • 在非递归函数中,应该是'while (binaryRep.length()...',以及'System.out.println(binaryRep);'(binaryRep而不是s )。
          【解决方案6】:

          更长的时间来解决您的问题

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

          【讨论】:

            【解决方案7】:

            我最近不得不做一些类似的事情,除了这个项目是为给定的逻辑表达式生成一个真值表。这就是我想出的为自变量分配真值的方法。

                column = 0;
            
                while (column < numVariables)
                {
                    state = false;
                    toggle = (short) Math.pow(2, numVariables - column - 1);
            
                    row = 1;
                    while (row < rows)
                    {
                        if ((row -1)%toggle == 0)
                            state = !state;
            
                        if (state)
                            truthTable[row][column] = 'T';
                        else
                            truthTable[row][column] = 'F';
            
                        row++;
                    }
            
                    column++;
                }
            

            这是假设您的第一行填充了变量名称和子表达式。如果您想从第 0 行开始,数学可能会略有变化。

            这一点……

            如果 ((row -1)%toggle == 0)

            会变成....

            如果 (row%toggle == 0)

            【讨论】:

              【解决方案8】:

              这个简单的程序将任何给定数量的输入的真值表存储在一个 int 数组中并打印出来。

              import java.util.Scanner;
              
              public class Main{
              
              public static class TruthTable {
                  public static int rows;
                  public static int nodes;
                  public static int[][] tt = new int[0][0];
              
              
                  TruthTable(int n) {
                      this.nodes = n;
                      this.rows = (int) Math.pow(2,n);
                      tt = new int[rows][nodes];
              
                      for (int i=0; i<rows; i++) {
                          for (int j=n-1; j>=0; j--) {
                              tt[i][j] = (i/(int) Math.pow(2, j))%2;
                          }  
                      }
                  }   
              
                  void printTable(){
                      for (int i=0; i<rows; i++) {
                          for (int j=nodes-1; j>=0; j--) {
                              System.out.printf("%d ", tt[i][j]);
                          }
                          System.out.println();
              
                      }
              
                  }
              }
              public static void main(String[] args) {
                  Scanner myObj = new Scanner(System.in);
                  System.out.println("Enter Size of Population: ");
                  int numberOfNodes = myObj.nextInt();
                  TruthTable myTable = new TruthTable(numberOfNodes);
                  //TruthTable.printTruthTable(3);
                  System.out.println();
              
                  myTable.printTable();
              
              }
              

              }

              【讨论】:

                猜你喜欢
                • 2016-03-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-07-30
                • 2010-10-31
                • 2011-03-31
                • 1970-01-01
                相关资源
                最近更新 更多