0

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?

Gianolepo
  • 155
  • 7
  • What if you use tabs to space your columns? And if 0 is not required, you can put a if condition to check if its 0 then print space. If you need to use setw then you can check if the number is greater than 9 or less than 100 and then adjust space accordingly. – clinomaniac Dec 01 '17 at 22:50
  • The `'\t'` character can be used to align text. Have you considered using starting `i` at 0 instead of having a separate loop at the start? – François Andrieux Dec 01 '17 at 22:51
  • As for the non nested while loop, you can have your loops start at 0 or go to 11 and print numbers accordingly and hide the 0 by printing space when you get both variables as 0. – clinomaniac Dec 01 '17 at 22:52

2 Answers2

2

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.

abdullah
  • 662
  • 5
  • 7
1

Things to consider:

  • Outputting tabs instead of trying to set the width is much easier, though you'll have less control over how your output looks (it will depend in the tab stop width of your console). But your standard tab stops will handle your range of values.
  • your problem statement doesn't say how many while loops you can use
  • You can use a while loop to emulate an if statement like this:

    while(j == 0){
        cout << i << '\t';
        break;
    }
    

I'll leave the rest as an exercise for you.

zdan
  • 28,667
  • 7
  • 60
  • 71