mirror of
https://github.com/theoludwig/programming-challenges.git
synced 2024-12-08 00:45:29 +01:00
feat(solutions): add prime-numbers-decomposition/c/function
This commit is contained in:
parent
74ded41d4d
commit
c682b174f3
@ -0,0 +1,3 @@
|
||||
# prime-numbers-decomposition/c/function
|
||||
|
||||
Created by [@Divlo](https://github.com/Divlo) on 16 October 2021.
|
@ -0,0 +1,82 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void print_array(int* numbers, int numbers_length) {
|
||||
for (int index = 0; index < numbers_length; index++) {
|
||||
printf("%d", numbers[index]);
|
||||
if (numbers_length - 1 != index) {
|
||||
printf(" * ");
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
int* get_dividers_list(int number, int* dividers_length) {
|
||||
*dividers_length = 1;
|
||||
int* dividers = malloc(sizeof(int) * *dividers_length);
|
||||
for (int index = 1; index <= number; index++) {
|
||||
if (number % index == 0) {
|
||||
dividers[*dividers_length - 1] = index;
|
||||
*dividers_length = *dividers_length + 1;
|
||||
dividers = realloc(dividers, sizeof(int) * *dividers_length);
|
||||
}
|
||||
}
|
||||
*dividers_length = *dividers_length - 1;
|
||||
return dividers;
|
||||
}
|
||||
|
||||
bool is_prime_number(int number) {
|
||||
int dividers_length;
|
||||
get_dividers_list(number, ÷rs_length);
|
||||
return dividers_length == 2;
|
||||
}
|
||||
|
||||
int sum_multiply_numbers(int* numbers, int numbers_length) {
|
||||
int sum = 1;
|
||||
for (int index = 0; index < numbers_length; index++) {
|
||||
sum = sum * numbers[index];
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
int* prime_numbers_decomposition(int number, int* decomposition_length) {
|
||||
*decomposition_length = 1;
|
||||
int* decomposition = malloc(sizeof(int) * *decomposition_length);
|
||||
int total = 0;
|
||||
int dividend = number;
|
||||
while (total != number) {
|
||||
int divider = 2;
|
||||
int reste = 0;
|
||||
int quotient = 0;
|
||||
do {
|
||||
reste = dividend % divider;
|
||||
quotient = dividend / divider;
|
||||
divider++;
|
||||
} while (reste != 0);
|
||||
divider--;
|
||||
decomposition[*decomposition_length - 1] = divider;
|
||||
*decomposition_length = *decomposition_length + 1;
|
||||
decomposition = realloc(decomposition, sizeof(int) * *decomposition_length);
|
||||
if (is_prime_number(quotient)) {
|
||||
decomposition[*decomposition_length - 1] = quotient;
|
||||
*decomposition_length = *decomposition_length + 1;
|
||||
total = sum_multiply_numbers(decomposition, *decomposition_length - 1);
|
||||
} else {
|
||||
total = sum_multiply_numbers(decomposition, *decomposition_length - 1);
|
||||
dividend = quotient;
|
||||
}
|
||||
}
|
||||
*decomposition_length = *decomposition_length - 1;
|
||||
return decomposition;
|
||||
}
|
||||
|
||||
int main() {
|
||||
int number;
|
||||
int decomposition_length = 0;
|
||||
scanf("%d", &number);
|
||||
int* decomposition = prime_numbers_decomposition(number, &decomposition_length);
|
||||
print_array(decomposition, decomposition_length);
|
||||
free(decomposition);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
Loading…
Reference in New Issue
Block a user