# Print a Multiplication Table

 WARNING: This example assumes the output is sent to a printer, and as a result, every formatted output contains printer control.

### Problem Statement

Write a program to print the multiplication table in the following form:
```         1    1    2    2    3    3    4    4    5    5    6    6    7    7
....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5
1*1= 1  1*2= 2  1*3= 3  1*4= 4  1*5= 5  1*6= 6  1*7= 7  1*8= 8  1*9= 9
2*1= 2  2*2= 4  2*3= 6  2*4= 8  2*5=10  2*6=12  2*7=14  2*8=16  2*9=18
:
:
8*1= 8  8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64  8*9=72
9*1= 9  9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81
```

### Solution

```PROGRAM  Multiplication_Table
IMPLICIT  NONE
INTEGER, PARAMETER :: MAX = 9
INTEGER            :: i, j
CHARACTER(LEN=80)  :: FORMAT

FORMAT = "(9(2X, I1, A, I1, A, I2))"
DO i = 1, MAX
WRITE(*,FORMAT) (i, '*', j, '=', i*j, j = 1, MAX)
END DO
END PROGRAM  Multiplication_Table
```

### Program Input and Output

The output of the program is:
```         1    1    2    2    3    3    4    4    5    5    6    6    7    7
....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5
1*1= 1  1*2= 2  1*3= 3  1*4= 4  1*5= 5  1*6= 6  1*7= 7  1*8= 8  1*9= 9
2*1= 2  2*2= 4  2*3= 6  2*4= 8  2*5=10  2*6=12  2*7=14  2*8=16  2*9=18
3*1= 3  3*2= 6  3*3= 9  3*4=12  3*5=15  3*6=18  3*7=21  3*8=24  3*9=27
4*1= 4  4*2= 8  4*3=12  4*4=16  4*5=20  4*6=24  4*7=28  4*8=32  4*9=36
5*1= 5  5*2=10  5*3=15  5*4=20  5*5=25  5*6=30  5*7=35  5*8=40  5*9=45
6*1= 6  6*2=12  6*3=18  6*4=24  6*5=30  6*6=36  6*7=42  6*8=48  6*9=54
7*1= 7  7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49  7*8=56  7*9=63
8*1= 8  8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64  8*9=72
9*1= 9  9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81
```

### Discussion

• A multiplication table has nine rows on each of which there are nine multiplication results. Each multiplication has a form of 4*5=20. The first and the second numbers are of single digit and the result has two digits (i.e., the largest result is 9*9=81). At a first glance, we could use I1,A,I1,A,I2 for printing the first number, *, the second number, =, and the result, respectively. Then, we can repeat it nine times, which gives the following format:
```(9(I1,A,I1,A,I2))
```
But, this will not work perfectly. If the above is expanded into the following:
```(I1,A,I1,A,I2,I1,A,I1,A,I2,I1,A,I1,A,I2,......,I1,A,I1,A,I2)
```
You will see that after the result is printed with I2, the next number will be printed with I1. Therefore, this result and the first number of the next multiplication will join together! More precisely, we would have the following output:
```1*1= 11*2= 21*3= 3 .......
```
To overcome this this problem, we should added a few spaces between two multiplication results. In the solution above, we use 2X to insert two spaces:
```FORMAT = "(9(2X, I1, A, I1, A, I2))"
```
• How to print the multiplication results on a row? An implied DO would suffice. To print the ith row, let j iterates from 1 to 9 and for each possible values of i and j, we print five items: i, "*", j, "=", and i*j.
```FORMAT = "(9(2X, I1, A, I1, A, I2))"

WRITE(*,FORMAT) (i, '*', j, '=', i*j, j = 1, MAX)
```
Since there are nine rows, i runs from 1 to 9 with a counting DO loop:
```FORMAT = "(9(2X, I1, A, I1, A, I2))"

DO i = 1, MAX
WRITE(*,FORMAT) (i, '*', j, '=', i*j, j = 1, MAX)
END DO
```