Search code examples
c++if-statementwhile-loopnested-loopscout

Printing a table using nested while loops only


I'm trying to print the following table in C++:

     1    2    3    4    5    6    7    8    9    10    
1    1    2    3    4    5    6    7    8    9    10    
2    2    4    6    8    10   12   14   16   18   20    
3    3    6    9    12   15   18   21   24   27   30    
4    4    8    12   16   20   24   28   32   36   40    
5    5    10   15   20   25   30   35   40   45   50    
6    6    12   18   24   30   36   42   48   54   60    
7    7    14   21   28   35   42   49   56   63   70    
8    8    16   24   32   40   48   56   64   72   80    
9    9    18   27   36   45   54   63   72   81   90    
10   10   20   30   40   50   60   70   80   90   100   

Using nested while loops only.


I have two main problems here:

  • I don't understand how to do it without using a non-nested while at the beginning (to print the first line), or an if statement for the first line.
  • Using setw I have problems trying to align the numbers with two digits.

Here is what I tried

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
  int k=0;
  while(k<=10)
  {cout << k << setw(5);
      k++;
  };
  cout << "\n";

  int i=1;
  while(i<=10){
      cout << i << setw(5);
      int j=1;
      while(j<=10){
          cout<< i*j << setw(5);
          j++;
      }
      cout << "\n";
    i++;
  }  
  return 0;
}

But, as said, I used a non-nested while at the beginning, and also the output is:

0    1    2    3    4    5    6    7    8    9   10    
1    1    2    3    4    5    6    7    8    9   10    
2    2    4    6    8   10   12   14   16   18   20    
3    3    6    9   12   15   18   21   24   27   30    
4    4    8   12   16   20   24   28   32   36   40    
5    5   10   15   20   25   30   35   40   45   50    
6    6   12   18   24   30   36   42   48   54   60    
7    7   14   21   28   35   42   49   56   63   70    
8    8   16   24   32   40   48   56   64   72   80    
9    9   18   27   36   45   54   63   72   81   90    
10   10   20   30   40   50   60   70   80   90  100 

Where the two-digits numbers are not aligned in the proper way. On the other hand I cannot think a way to modify the loop in order to increase the space only for two digits number, without using an if statement.

So am I missing something or it is not possible to print the table above without using if or non-nested while?


Solution

  • I think you want to hide first 0 value. To hide it, I have used some bit manipulations. There is no if statement and all of the printing in nested while.

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    int main()
    {
      int i = 0, k = 0;
      while (i < 10){
          int j = 0;
          while (j <= 10){
              cout << left << setw(5);
              (i || j || k) && cout << j + i * j + !j * (i + 1);
              !(i || j || k) && cout << "";
              j++;
          }
          cout << "\n";
          i += k++ > 0;
      }  
      return 0;
    }
    

    The output is

         1    2    3    4    5    6    7    8    9    10   
    1    1    2    3    4    5    6    7    8    9    10   
    2    2    4    6    8    10   12   14   16   18   20   
    3    3    6    9    12   15   18   21   24   27   30   
    4    4    8    12   16   20   24   28   32   36   40   
    5    5    10   15   20   25   30   35   40   45   50   
    6    6    12   18   24   30   36   42   48   54   60   
    7    7    14   21   28   35   42   49   56   63   70   
    8    8    16   24   32   40   48   56   64   72   80   
    9    9    18   27   36   45   54   63   72   81   90   
    10   10   20   30   40   50   60   70   80   90   100
    

    Explanation:

    1. I have used j for seed and i * j for new value for (j + 1)-th column. It works perfectly for from first row second column to last row last column.
    2. For first column, j is always 0. To make it work, I used !j * (i + 1) which prints 0 to 10 for first column.
    3. To hide 0 for first row and first column, all of i, j and k are 0. For all other cells, at least one of them has value other than 0.

    If still unclear, I'll explain with example.