Upload
diem
View
56
Download
0
Tags:
Embed Size (px)
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
Citation preview
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
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);}
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];
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
1D Arrays-5
Warning
Warning
Warning
Instructor about to sneak in new concept which will lead to homework problem
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.
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
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)
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)
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)
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)
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)
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)
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
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);
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);}
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); }}
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); }}
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
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
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
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
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
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
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
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
+
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
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
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
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
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
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
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
+
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
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
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
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
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
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
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
+
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;
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;
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;
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;
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;
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;}
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);}
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);}
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
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)
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)
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)
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)
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)
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
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);
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); }}
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)
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)
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;
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(“ “);
}}
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); }}
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;}
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];}
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) ******************************************/
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); }}