-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaddition.c
More file actions
37 lines (37 loc) · 1.12 KB
/
Copy pathaddition.c
File metadata and controls
37 lines (37 loc) · 1.12 KB
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
//because digits can be up to base 32, it is necessary to have a custom addition function designed to handle
//integer overflow
unsigned int* addition(unsigned int *int_a, unsigned int *int_b, unsigned int size_a, unsigned int size_b, unsigned int base) {
unsigned int i;
unsigned long long carry = 0;
unsigned int *int_c;
if (size_a > size_b) {
int_c = malloc((size_a + 1) * sizeof(int));
memset(int_c, 0, (size_a + 1) * sizeof(int));
for (i = 0; i < size_b; i++) {
carry = int_a[i];
carry += int_b[i];
int_c[i] += carry % base;
int_c[i+1] += carry / base;
}
for (i; i < size_a; i++) {
carry = int_a[i];
int_c[i] += carry % base;
int_c[i+1] += carry / base;
}
} else {
int_c = malloc((size_b + 1) * sizeof(int));
memset(int_c, 0, (size_b + 1) * sizeof(int));
for (i = 0; i < size_a; i++) {
carry = int_a[i];
carry += int_b[i];
int_c[i] += carry % base;
int_c[i+1] += carry / base;
}
for (i; i < size_b; i++) {
carry = int_b[i];
int_c[i] += carry % base;
int_c[i+1] += carry / base;
}
}
return int_c;
}