factorials to n digits

66
1D Arrays-1 Factorials to N digits. • N! = 1 * 2 * 3 * 4 …. (N-2) * (N- 1) * N • Factorials get very big very fast • long = 32 bits on most computers • 32 bits gives a range of 2 31 -1 • Note 2 31 -1 = 2147483647 = ~ 2.14 x 10 9 • Note 13! > 4 x 10 9

Upload: diem

Post on 14-Jan-2016

56 views

Category:

Documents


0 download

DESCRIPTION

Factorials to N digits. N! = 1 * 2 * 3 * 4 …. (N-2) * (N-1) * N Factorials get very big very fast long = 32 bits on most computers 32 bits gives a range of ± 2 31 -1 Note ± 2 31 -1 = ± 2147483647 = ~ 2.14 x 10 9 Note 13! > 4 x 10 9. Example factorial program. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Factorials to N digits

1D Arrays-1

Factorials to N digits.

• N! = 1 * 2 * 3 * 4 …. (N-2) * (N-1) * N

• Factorials get very big very fast

• long = 32 bits on most computers

• 32 bits gives a range of 231-1

• Note 231-1 = 2147483647 = ~ 2.14 x 109

• Note 13! > 4 x 109

Page 2: Factorials to N digits

1D Arrays-2

Example factorial program#include <stdio.h>main(){ long I, N, Nfact; printf(“N Factorial program\nEnter a number: \n”); scanf(“%d”,&N); Nfact = 1; for (I = 1, I <= N; I++) { Nfact = Nfact * I;

} printf(“N!=%d”,Nfact);}

Page 3: Factorials to N digits

1D Arrays-3

8000

842976

85

256

497

5Review of one dimensional arrays

An array is a group of memory locations with a name…any single memory location may be accessed by means of a subscript

[9][8][7][6][5][4]

[1]

[3][2]

[0]Mult

int Mult[10] /* declares this array *//* Depending on version of C, array may be initially zero, or initially undefined */

/* Find sum of elements in Mult array */

Sum = 0;for (I=0; I<10; I++) Sum = Sum + Mult[I];

Page 4: Factorials to N digits

1D Arrays-4

[0]

Another Application of ArraysAlthough 1-D Arrays are generally viewed as a column, they could be viewed as a row…for example:

unsigned short int Multiplicand[10];

[4] [3] [2] [1][5][9] [8] [7] [6]06 2 8 830 0 0 0 Multiplicand

Each element of Multiplicand[ ] may hold a value between 0 and 255.

I could choose to interpret the above array to represent the value 362,880

Page 5: Factorials to N digits

1D Arrays-5

Warning

Warning

Warning

Instructor about to sneak in new concept which will lead to homework problem

Page 6: Factorials to N digits

1D Arrays-6

[0][4] [3] [2] [1][5][9] [8] [7] [6]06 2 8 830 0 0 0 NumA

unsigned short int NumA[10];

If I choose to view the above array as a single value of 362,880…Then I need to develop ways to perform arthmetic operations on this new data type.

Page 7: Factorials to N digits

1D Arrays-7

[0][4] [3] [2] [1][5][9] [8] [7] [6]06 2 8 830 0 0 0 NumA

unsigned short int NumA[10];unsigned short int NumB[10];unsigned short int NumC[10];

/* How could NumC = NumA + NumB be implimented ?*/

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 7 9 200 0 0 0 NumB

Page 8: Factorials to N digits

1D Arrays-8

[0][4] [3] [2] [1][5][9] [8] [7] [6]06 2 8 830 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 7 9 200 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]5? ? ? ??? ? ? ? NumC

NumC[0] = (NumA[0]+NumB[0]+Carry) % 10;Carry =(int)((NumA[0]+NumB[0]+Carry) / 10);

0 Carry

0 Carry

(before)

(after)

Page 9: Factorials to N digits

1D Arrays-9

[0][4] [3] [2] [1][5][9] [8] [7] [6]06 2 8 830 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 7 9 200 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]5? ? ? 0?? ? ? ? NumC

NumC[1] = (NumA[1]+NumB[1]+Carry) % 10; Carry =(int)((NumA[1]+NumB[1]+Carry) / 10);

0 Carry

1 Carry

(before)

(after)

Page 10: Factorials to N digits

1D Arrays-10

[0][4] [3] [2] [1][5][9] [8] [7] [6]06 2 8 830 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 7 9 200 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]5? ? 8 0?? ? ? ? NumC

NumC[2] = (NumA[2]+NumB[2]+Carry) % 10; Carry =(int)((NumA[2]+NumB[2]+Carry) / 10);

1 Carry

1 Carry

(before)

(after)

Page 11: Factorials to N digits

1D Arrays-11

[0][4] [3] [2] [1][5][9] [8] [7] [6]06 2 8 830 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 7 9 200 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]5? 0 8 0?? ? ? ? NumC

NumC[3] = (NumA[3]+NumB[3]+Carry) % 10; Carry =(int)((NumA[3]+NumB[3]+Carry) / 10);

1 Carry

1 Carry

(before)

(after)

Page 12: Factorials to N digits

1D Arrays-12

[0][4] [3] [2] [1][5][9] [8] [7] [6]06 2 8 830 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 7 9 200 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]57 0 8 0?? ? ? ? NumC

NumC[4] = (NumA[4]+NumB[4]+Carry) % 10; Carry =(int)((NumA[4]+NumB[4]+Carry) / 10);

1 Carry

0 Carry

(before)

(after)

Page 13: Factorials to N digits

1D Arrays-13

[0][4] [3] [2] [1][5][9] [8] [7] [6]06 2 8 830 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 7 9 200 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]57 0 8 03? ? ? ? NumC

NumC[5] = (NumA[5]+NumB[5]+Carry) % 10; Carry =(int)((NumA[5]+NumB[5]+Carry) / 10);

0 Carry

0 Carry

(before)

(after)

Page 14: Factorials to N digits

1D Arrays-14

[0][4] [3] [2] [1][5][9] [8] [7] [6]06 2 8 830 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 7 9 200 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]57 0 8 03? ? ? 0 NumC

NumC[6] = (NumA[6]+NumB[6]+Carry) % 10; Carry =(int)((NumA[6]+NumB[6]+Carry) / 10);

0 Carry

0 Carry

(before)

(after)Note: cases 7, 8, and 9 are similar (identical) to case 6

Page 15: Factorials to N digits

1D Arrays-15

In SUMmaryCarry = 0;

NumC[0] = (NumA[0]+NumB[0]+Carry) % 10; Carry =(int)((NumA[0]+NumB[0]+Carry) / 10);

NumC[1] = (NumA[1]+NumB[1]+Carry) % 10; Carry =(int)((NumA[1]+NumB[1]+Carry) / 10);

NumC[2] = (NumA[2]+NumB[2]+Carry) % 10; Carry =(int)((NumA[2]+NumB[2]+Carry) / 10);

NumC[3] = (NumA[3]+NumB[3]+Carry) % 10; Carry =(int)((NumA[3]+NumB[3]+Carry) / 10);

::

NumC[9] = (NumA[9]+NumB[9]+Carry) % 10; Carry =(int)((NumA[9]+NumB[9]+Carry) / 10);

Page 16: Factorials to N digits

1D Arrays-16

In SUMmaryCarry = 0;

for (J=0; J<10; J++){ NumC[J] = (NumA[J]+NumB[J]+Carry) % 10; Carry =(int)((NumA[J]+NumB[J]+Carry) / 10);}

Page 17: Factorials to N digits

1D Arrays-17

In SUMmary/*Routine to sum three items of my data type*/

void MySum(unsigned short int NumA[ ], unsigned short int NumB[ ], unsigned short int NumC[ ] ){ unsigned short int Carry = 0; unsigned short int J;

for (J=0; J<10; J++) { NumC[J]= (NumA[J]+NumB[J]+Carry) % 10; Carry=(int)((NumA[J]+NumB[J]+Carry) / 10); }}

Page 18: Factorials to N digits

1D Arrays-18

In SUMmary (w typedef)/* near top of source file */typedef unsigned short int uByte;/*Routine to sum three items of my data type*/void MySum(uByte NumA[],

uByte NumB[], uByte NumC[]){ uByte Carry = 0; uByte J;

for (J=0; J<10; J++) { NumC[J]= (NumA[J]+NumB[J]+Carry) % 10; Carry=(int)((NumA[J]+NumB[J]+Carry) / 10); }}

Page 19: Factorials to N digits

1D Arrays-19

[0][4] [3] [2] [1][5][9] [8] [7] [6]00 0 0 000 0 0 0 NumZ

[0][4] [3] [2] [1][5][9] [8] [7] [6]00 0 0 000 0 0 0 Answer

0 Carry(initial)

Multiplication – A bit trickierAnswer = NumA * NumBNumZ will hold intermediate values

Start by initializing NumZ and Answer to zeroCarry should also be initialized to zero

Page 20: Factorials to N digits

1D Arrays-20

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 0 000 0 0 0 NumZ

NumZ[0] = (NumA[0]*NumB[0]+Carry) % 10; Carry =(int)((NumA[0]*NumB[0]+Carry) / 10);

0 Carry

1 Carry

(before)

(after)

Multiplication

Page 21: Factorials to N digits

1D Arrays-21

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 0 100 0 0 0 NumZ

NumZ[1] = (NumA[1]*NumB[0]+Carry) % 10; Carry =(int)((NumA[1]*NumB[0]+Carry) / 10);

1 Carry

4 Carry

(before)

(after)

Multiplication

Page 22: Factorials to N digits

1D Arrays-22

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 100 0 0 0 NumZ

NumZ[2] = (NumA[2]*NumB[0]+Carry) % 10; Carry =(int)((NumA[2]*NumB[0]+Carry) / 10);

4 Carry

4 Carry

(before)

(after)

Multiplication

Page 23: Factorials to N digits

1D Arrays-23

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 4 4 100 0 0 0 NumZ

NumZ[3] = (NumA[3]*NumB[0]+Carry) % 10; Carry =(int)((NumA[3]*NumB[0]+Carry) / 10);

4 Carry

1 Carry

(before)

(after)

Multiplication

Page 24: Factorials to N digits

1D Arrays-24

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]51 4 4 100 0 0 0 NumZ

NumZ[4] = (NumA[4]*NumB[0]+Carry) % 10; Carry =(int)((NumA[4]*NumB[0]+Carry) / 10);

1 Carry

0 Carry

(before)

(after)

Multiplication

Page 25: Factorials to N digits

1D Arrays-25

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]51 4 4 100 0 0 0 NumZ

NumZ[5] = (NumA[5]*NumB[0]+Carry) % 10; Carry =(int)((NumA[5]*NumB[0]+Carry) / 10);

1 Carry

0 Carry

(before)

(after)

Multiplication

Note: Cases 6, 7, 8, 9 are similar to case 5

Page 26: Factorials to N digits

1D Arrays-26

[0][4] [3] [2] [1][5][9] [8] [7] [6]00 0 0 000 0 0 0 Answer

[0][4] [3] [2] [1][5][9] [8] [7] [6]51 4 4 100 0 0 0 NumZ

[0][4] [3] [2] [1][5][9] [8] [7] [6]51 4 4 100 0 0 0 Answer

Next step: Sum “Answer” and NumZ

+

Page 27: Factorials to N digits

1D Arrays-27

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]00 0 0 800 0 0 0 NumZ

NumZ[1] = (NumA[0]*NumB[1]+Carry) % 10; Carry =(int)((NumA[0]*NumB[1]+Carry) / 10);

0 Carry

1 Carry

(before)

(after)

Multiplication

Page 28: Factorials to N digits

1D Arrays-28

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]00 0 9 800 0 0 0 NumZ

NumZ[2] = (NumA[1]*NumB[1]+Carry) % 10; Carry =(int)((NumA[1]*NumB[1]+Carry) / 10);

1 Carry

4 Carry

(before)

(after)

Multiplication

Page 29: Factorials to N digits

1D Arrays-29

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]00 2 9 800 0 0 0 NumZ

NumZ[3] = (NumA[2]*NumB[1]+Carry) % 10; Carry =(int)((NumA[2]*NumB[1]+Carry) / 10);

4 Carry

5 Carry

(before)

(after)

Multiplication

Page 30: Factorials to N digits

1D Arrays-30

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]07 2 9 800 0 0 0 NumZ

NumZ[4] = (NumA[3]*NumB[1]+Carry) % 10; Carry =(int)((NumA[3]*NumB[1]+Carry) / 10);

5 Carry

1 Carry

(before)

(after)

Multiplication

Page 31: Factorials to N digits

1D Arrays-31

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]07 2 9 810 0 0 0 NumZ

NumZ[5] = (NumA[4]*NumB[1]+Carry) % 10; Carry =(int)((NumA[4]*NumB[1]+Carry) / 10);

1 Carry

0 Carry

(before)

(after)

Multiplication

Page 32: Factorials to N digits

1D Arrays-32

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]07 2 9 810 0 0 0 NumZ

NumZ[6] = (NumA[5]*NumB[1]+Carry) % 10; Carry =(int)((NumA[5]*NumB[1]+Carry) / 10);

1 Carry

0 Carry

(before)

(after)

Multiplication

Note: Cases 6, 7, 8, 9 are similar to case 5

Page 33: Factorials to N digits

1D Arrays-33

[0][4] [3] [2] [1][5][9] [8] [7] [6]51 4 4 100 0 0 0 Answer

[0][4] [3] [2] [1][5][9] [8] [7] [6]07 2 9 810 0 0 0 NumZ

[0][4] [3] [2] [1][5][9] [8] [7] [6]58 7 3 910 0 0 0 Answer

Next step: Sum “Answer” and NumZ

+

Page 34: Factorials to N digits

1D Arrays-34

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]00 0 2 000 0 0 0 NumZ

NumZ[2] = (NumA[0]*NumB[2]+Carry) % 10; Carry =(int)((NumA[0]*NumB[2]+Carry) / 10);

0 Carry

1 Carry

(before)

(after)

Multiplication

Page 35: Factorials to N digits

1D Arrays-35

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]00 3 2 000 0 0 0 NumZ

NumZ[3] = (NumA[1]*NumB[2]+Carry) % 10; Carry =(int)((NumA[1]*NumB[2]+Carry) / 10);

1 Carry

3 Carry

(before)

(after)

Multiplication

Page 36: Factorials to N digits

1D Arrays-36

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]05 3 2 000 0 0 0 NumZ

NumZ[4] = (NumA[2]*NumB[2]+Carry) % 10; Carry =(int)((NumA[2]*NumB[2]+Carry) / 10);

3 Carry

3 Carry

(before)

(after)

Multiplication

Page 37: Factorials to N digits

1D Arrays-37

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]05 3 2 010 0 0 0 NumZ

NumZ[5] = (NumA[3]*NumB[2]+Carry) % 10; Carry =(int)((NumA[3]*NumB[2]+Carry) / 10);

3 Carry

1 Carry

(before)

(after)

Multiplication

Page 38: Factorials to N digits

1D Arrays-38

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]05 3 2 010 0 0 1 NumZ

NumZ[6] = (NumA[4]*NumB[2]+Carry) % 10; Carry =(int)((NumA[4]*NumB[2]+Carry) / 10);

1 Carry

0 Carry

(before)

(after)

Multiplication

Page 39: Factorials to N digits

1D Arrays-39

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 4 600 0 0 0 NumB

[0][4] [3] [2] [1][5][9] [8] [7] [6]05 3 2 010 0 0 1 NumZ

NumZ[7] = (NumA[5]*NumB[2]+Carry) % 10; Carry =(int)((NumA[5]*NumB[2]+Carry) / 10);

0 Carry

0 Carry

(before)

(after)

Multiplication

Note: Cases 6, 7, 8, 9 are similar to case 5

Page 40: Factorials to N digits

1D Arrays-40

[0][4] [3] [2] [1][5][9] [8] [7] [6]58 7 3 910 0 0 0 Answer

[0][4] [3] [2] [1][5][9] [8] [7] [6]05 3 2 010 0 0 1 NumZ

[0][4] [3] [2] [1][5][9] [8] [7] [6]54 0 5 930 0 0 1 Answer

Next step: Sum “Answer” and NumZ

+

Page 41: Factorials to N digits

1D Arrays-41

Multiply SummaryCarry=0; Answer[]=0; NumZ[]=0;

NumZ[0] = (NumA[0]*NumB[0]+Carry) % 10;Carry =(int)((NumA[0]*NumB[0]+Carry) / 10);

NumZ[1] = (NumA[1]*NumB[0]+Carry) % 10;Carry =(int)((NumA[1]*NumB[0]+Carry) / 10);

NumZ[2] = (NumA[2]*NumB[0]+Carry) % 10; Carry =(int)((NumA[2]*NumB[0]+Carry) / 10);

::

NumZ[8] = (NumA[8]*NumB[0]+Carry) % 10;Carry =(int)((NumA[8]*NumB[0]+Carry) / 10);

NumZ[9] = (NumA[9]*NumB[0]+Carry) % 10;Carry =(int)((NumA[9]*NumB[0]+Carry) / 10);Answer = Answer + NumZ;

Page 42: Factorials to N digits

1D Arrays-42

Multiply SummaryNumZ = 0

NumZ[1] = (NumA[0]*NumB[1]+Carry) % 10;Carry =(int)((NumA[0]*NumB[1]+Carry) / 10);

NumZ[2] = (NumA[1]*NumB[1]+Carry) % 10;Carry =(int)((NumA[1]*NumB[1]+Carry) / 10);

NumZ[3] = (NumA[2]*NumB[1]+Carry) % 10; Carry =(int)((NumA[2]*NumB[1]+Carry) / 10);

::

NumZ[9] = (NumA[8]*NumB[1]+Carry) % 10;Carry =(int)((NumA[8]*NumB[1]+Carry) / 10);

Answer = Answer + NumZ;

Page 43: Factorials to N digits

1D Arrays-43

Multiply SummaryNumZ = 0

NumZ[2] = (NumA[0]*NumB[2]+Carry) % 10;Carry =(int)((NumA[0]*NumB[2]+Carry) / 10);

NumZ[3] = (NumA[1]*NumB[2]+Carry) % 10;Carry =(int)((NumA[1]*NumB[2]+Carry) / 10);

NumZ[4] = (NumA[2]*NumB[2]+Carry) % 10; Carry =(int)((NumA[2]*NumB[2]+Carry) / 10);

::

NumZ[9] = (NumA[7]*NumB[2]+Carry) % 10;Carry =(int)((NumA[7]*NumB[2]+Carry) / 10);

Answer = Answer + NumZ;

Page 44: Factorials to N digits

1D Arrays-44

Multiply SummaryNumZ = 0

NumZ[3] = (NumA[0]*NumB[3]+Carry) % 10;Carry =(int)((NumA[0]*NumB[3]+Carry) / 10);

NumZ[4] = (NumA[1]*NumB[3]+Carry) % 10;Carry =(int)((NumA[1]*NumB[3]+Carry) / 10);

NumZ[5] = (NumA[2]*NumB[3]+Carry) % 10; Carry =(int)((NumA[2]*NumB[3]+Carry) / 10);

::

NumZ[9] = (NumA[6]*NumB[3]+Carry) % 10;Carry =(int)((NumA[6]*NumB[3]+Carry) / 10);

Answer = Answer + NumZ;

Page 45: Factorials to N digits

1D Arrays-45

Multiply SummaryNumZ = 0

NumZ[4] = (NumA[0]*NumB[4]+Carry) % 10;Carry =(int)((NumA[0]*NumB[4]+Carry) / 10);

NumZ[5] = (NumA[1]*NumB[4]+Carry) % 10;Carry =(int)((NumA[1]*NumB[4]+Carry) / 10);

NumZ[6] = (NumA[2]*NumB[4]+Carry) % 10; Carry =(int)((NumA[2]*NumB[4]+Carry) / 10);

::

NumZ[9] = (NumA[5]*NumB[4]+Carry) % 10;Carry =(int)((NumA[5]*NumB[4]+Carry) / 10);

Answer = Answer + NumZ;

Page 46: Factorials to N digits

1D Arrays-46

Multiply Summary

/* At top of program */

#define MAXDIG 10typedef unsigned short int uByte

/* Set an value to zero */

void SetZero(uByte X[ ]){ int I; for (I=0; I<MAXDIG; I++) X[I] = 0;}

Page 47: Factorials to N digits

1D Arrays-47

Multiply Summary#define MAXDIG 10

SetZero(Answer); /* Answer = 0 */for (I=0; I<MAXDIG/2; I++){ Carry=0; SetZero(NumZ); /* NumZ = 0 */ for (J=0; J<MAXDIG/2; J++) { NumZ[I+J]= (NumA[J]*NumB[I]+Carry)%10; Carry=(int)((NumA[J]*NumB[I]+Carry)/10); } MySum(Answer,NumZ,Answer);}

Page 48: Factorials to N digits

1D Arrays-48

Multiply Summary/* Near top of source file */#define MAXDIG 10typedef unsigned short int uBytevoid ArrayNumMult(uByte NumA[ ],uByte NumB[ ],

uByte Ans[ ]){ /* procedure to multiply two ArrayNum's together */ int I,J; uByte NumZ[MAXDIG],Carry=0; SetZero(Ans); for (I=0; I<MAXDIG/2; I++) { Carry=0; SetZero(NumZ); for (J=0; J<MAXDIG/2; J++) { NumZ[I+J]= (NumA[J]*NumB[I]+Carry)%10; Carry=(int)((NumA[J]*NumB[I]+Carry)/10); } MySum(Ans,NumZ,Ans);}

Page 49: Factorials to N digits

1D Arrays-49

Multiply (Way 2)

- Multiply an “ArrayNum” by a “scalar”

- In example we’ll use an ArrayNum * int

- Similar to ArrayNum * ArrayNum, but easier

Page 50: Factorials to N digits

1D Arrays-50

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

25 Multplr

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 0 000 0 0 0 Ans

Ans[0]= (NumA[0]*Multplr+Carry) % 10; Carry =(int)((NumA[0]*Multplr+Carry) / 10);

0 Carry

7 Carry

(before)

(after)

Multiplication (Way2)

Page 51: Factorials to N digits

1D Arrays-51

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

25 Multplr

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 0 700 0 0 0 Ans

Ans[1]= (NumA[1]*Multplr+Carry) % 10; Carry =(int)((NumA[1]*Multplr+Carry) / 10);

7 Carry

20 Carry

(before)

(after)

Multiplication (Way2)

Page 52: Factorials to N digits

1D Arrays-52

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

25 Multplr

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 0 0 700 0 0 0 Ans

Ans[2]= (NumA[2]*Multplr+Carry) % 10;Carry =(int)((NumA[2]*Multplr+Carry) / 10);

20 Carry

22 Carry

(before)

(after)

Multiplication (Way2)

Page 53: Factorials to N digits

1D Arrays-53

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

25 Multplr

[0][4] [3] [2] [1][5][9] [8] [7] [6]50 2 0 700 0 0 0 Ans

Ans[3]= (NumA[3]*Multplr+Carry) % 10; Carry =(int)((NumA[3]*Multplr+Carry) / 10);

22 Carry

7 Carry

(before)

(after)

Multiplication (Way2)

Page 54: Factorials to N digits

1D Arrays-54

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

25 Multplr

[0][4] [3] [2] [1][5][9] [8] [7] [6]57 2 0 700 0 0 0 Ans

Ans[4]= (NumA[4]*Multplr+Carry) % 10; Carry =(int)((NumA[4]*Multplr+Carry) / 10);

7 Carry

0 Carry

(before)

(after)

Multiplication (Way2)

Page 55: Factorials to N digits

1D Arrays-55

[0][4] [3] [2] [1][5][9] [8] [7] [6]30 2 8 800 0 0 0 NumA

25 Multplr

[0][4] [3] [2] [1][5][9] [8] [7] [6]57 2 0 700 0 0 0 Ans

Ans[5]= (NumA[5]*Multplr+Carry) % 10;Carry =(int)((NumA[5]*Multplr+Carry) / 10);

0 Carry

0 Carry

(before)

(after)

Multiplication (Way2)

Cases 5,6,7,8,9 all identical

Page 56: Factorials to N digits

1D Arrays-56

Multiplication Summary (Way 2)Carry = 0;Ans[0]= (NumA[0]*Multplr+Carry) % 10;Carry =(int)((NumA[0]*Multplr+Carry) / 10);Ans[1]= (NumA[1]*Multplr+Carry) % 10;Carry =(int)((NumA[1]*Multplr+Carry) / 10);Ans[2]= (NumA[2]*Multplr+Carry) % 10;Carry =(int)((NumA[2]*Multplr+Carry) / 10);Ans[3]= (NumA[3]*Multplr+Carry) % 10;Carry =(int)((NumA[3]*Multplr+Carry) / 10);Ans[4]= (NumA[4]*Multplr+Carry) % 10;Carry =(int)((NumA[4]*Multplr+Carry) / 10);Ans[5]= (NumA[5]*Multplr+Carry) % 10;Carry =(int)((NumA[5]*Multplr+Carry) / 10);

Page 57: Factorials to N digits

1D Arrays-57

Multiplication Summary (Way 2)void SMult(uByte NumA[],int Multplr,uByte Ans[]){ int j, Carry=0; for (j=0; j<MAXDIG; j++) { Ans[j]= (NumA[j]*Multplr+Carry) % 10; Carry =(int)((NumA[j]*Multplr+Carry) / 10); }}

Page 58: Factorials to N digits

1D Arrays-58

Program Case StudyFactorials 1! To 100!

• No “built in” data type in C will represent 100 factorial (or much beyond 13!)

• Note that (N+1)! = N! * (N+1)(If I know 51!, then multiplying it by 52 will give me 52 factorial)

• No input needed• Need an output procedure (PrintNum)• Have SMult, and SetZero procedures• May need a CopyXtoY procedure (copy one

uByte array to another)

Page 59: Factorials to N digits

1D Arrays-59

Case Study (1! To 100!)Variables needed:

uByte Answer[MAXDIG], T[MAXDIG]int N

Routines needed: SetZero(X), SMult(X,Multplr,Z), PrintNum(X)Possible Routines: CopyXtoY(X,Y) (X, Y, and Z above represent formal parameters of a uByte array)

Overall Logic:T = 1;for N=1 to 100

Answer = T * Nprint N “!=“ AnswerCopyXtoY(Answer,T)

Page 60: Factorials to N digits

1D Arrays-60

Case Study (1! To 100!)/* Needed global defs */

#include <stdio.h>#define MAXDIG 200#define MAXFACT 30 /* for testing */

typedef unsigned short int uByte;

Page 61: Factorials to N digits

1D Arrays-61

Case Study (1! To 100!)/* PrintNum – print an uByte array */void PrintNum(uByte X[ ]){ int j, NonZeroSeen = 0; for (j=MAXDIG-1; j>=0; j--) { if (X[j] != 0) NonZeroSeen = 1; if (NonZeroSeen) printf(“%1d”,X[j]); else printf(“ “);

}}

Page 62: Factorials to N digits

1D Arrays-62

Case Study (1! To 100!)/* Multiply a uByte array by a scalar */

void SMult(uByte X[],int M,uByte Z[]){ int j, Carry=0; for (j=0; j<MAXDIG; j++) { Z[j]= (X[j]*M+Carry) % 10; Carry =(int)((X[j]*M+Carry) / 10); }}

Page 63: Factorials to N digits

1D Arrays-63

Case Study (1! To 100!)/* Set an value to zero */

void SetZero(uByte X[ ]){ int j; for (j=0; j<MAXDIG; j++) X[j] = 0;}

Page 64: Factorials to N digits

1D Arrays-64

Case Study (1! To 100!)/* copy one uByte to another */

void CopyXtoY(uByte X[ ], uByte Y[ ]){ int j; for (j=0; j<MAXDIG; j++) Y[j] = X[j];}

Page 65: Factorials to N digits

1D Arrays-65

Case Study (1! To 100!)/****************************************** ** ECE 161 Case Study ** Factorials (1! To 100!) ** ** P. Viall – Spring 2001 ** ******* Main Program - Overall Logic ****** * T=1 ** for N=1 to 100 ** Answer = T * N ** print N “!=“ Answer ** CopyAtoB(Answer,T) ******************************************/

Page 66: Factorials to N digits

1D Arrays-66

Case Study (1! To 100!)void main(void){ uByte Ans[MAXDIG], T[MAXDIG]; int N; SetZero(T); T[0]=1; for (N=1; N<=MAXFACT; N++) { SMult(T,N,Ans); printf(“%4d != “,N); PrintNum(Ans); printf(“\n”); CopyXtoY(Ans,T); }}