-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpascalsTriangle.c
154 lines (119 loc) · 3.62 KB
/
pascalsTriangle.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include <ctype.h>
#include <f2fs_fs.h>
int lengthOfInteger(int i);
void printMatrix(int *triangle, int lengthOfMatrix, int rows);
void printNumber(int number, int maxLengthOfNums);
int *createPascalTriangle(int rows);
void addOneEdgesToTriangle(int nums, int *pascalTriangle);
void calculateNormalNumbers(int nums, int *pascalTriangle);
void printSpaceNTimes(int n);
int gaussianSumFormula(int rows);
int maxLengthOfIntsInNums(int *nums, int size);
bool isValidInput(int argc, char *const *argv);
void addBeginOfTriangle(int *pascalTriangle);
int main(int argc, char *argv[]) {
if (isValidInput(argc, argv)) {
int size = atoi(argv[1]);
int *pascalTriangle = createPascalTriangle(size);
printMatrix(pascalTriangle, gaussianSumFormula(size), size);
} else {
printf("Please enter a valid number as first argument!\n");
}
return 0;
}
bool isValidInput(int argc, char *const *argv) {
return argc > 1 && isdigit(*argv[1]) != 0;
}
int *createPascalTriangle(int rows) {
int nums = gaussianSumFormula(rows);
int *pascalTriangle = malloc(nums * sizeof(int));
addBeginOfTriangle(pascalTriangle);
addOneEdgesToTriangle(nums, pascalTriangle);
calculateNormalNumbers(nums, pascalTriangle);
return pascalTriangle;
}
/**
* First fourth entries are one.
* @param pascalTriangle pascalTriangle to create
*/
void addBeginOfTriangle(int *pascalTriangle) {
pascalTriangle[0] = 1;
pascalTriangle[1] = 1;
pascalTriangle[2] = 1;
pascalTriangle[3] = 1;
}
void calculateNormalNumbers(int nums, int *pascalTriangle) {
int row = 3;
int numInRow = 0;
for (int i = 4 ; i < nums; i++) {
if (pascalTriangle [i] != 1) {
pascalTriangle[i] = pascalTriangle[i - row] + pascalTriangle[i - row + 1];
}
numInRow++;
if (numInRow == row) {
row++;
numInRow = 0;
}
}
}
/*
* Add ones to the triangle. In graphical representation this would be every number that is at the start or end of a
* row.
*/
void addOneEdgesToTriangle(int nums, int *pascalTriangle) {
int jumps = 1;
for (int i = 4 ; i < nums; i++) {
i += jumps;
pascalTriangle[i] = 1;
pascalTriangle[i + 1] = 1;
i++;
jumps++;
}
}
void printMatrix(int *triangle, int lengthOfMatrix, int rows) {
int maxLength = maxLengthOfIntsInNums(triangle, lengthOfMatrix) + 1;
int middleOfMatrix = ( (rows + 1) * maxLength) / 2;
int spaceAtNewLine = middleOfMatrix - maxLength;
int lengthOfRow = 1;
int idx = 0;
while (idx < lengthOfMatrix) {
int printedOfRow = 0;
printSpaceNTimes(spaceAtNewLine);
while (printedOfRow < lengthOfRow) {
printNumber(triangle[idx], maxLength);
idx++;
printedOfRow++;
}
spaceAtNewLine -= (maxLength / 2);
printf("\n");
lengthOfRow++;
}
}
void printNumber(int number, int maxLengthOfNums) {
int space = (maxLengthOfNums - lengthOfInteger(number)) / 2 + 1;
printf("%d", number);
printSpaceNTimes(space);
}
void printSpaceNTimes(int n) {
for (int i = 0; i < n; i++) {
printf(" ");
}
}
int maxLengthOfIntsInNums(int *nums, int size) {
int length = 1;
for (int i = 0 ; i < size ; i++) {
if (lengthOfInteger(nums[i]) > length) {
length = lengthOfInteger(nums[i]);
}
}
return length;
}
int lengthOfInteger(int i) {
return (i==0 ) ? 1 : floor(log10(abs(i))) + 1;
}
int gaussianSumFormula(int rows) {
return (int) (pow((double) rows, 2) + rows) / 2;
}