From 056a88ee9c2c9e26f9712d14c645e367d851f394 Mon Sep 17 00:00:00 2001 From: Charles Date: Tue, 6 Aug 2019 16:56:43 +0200 Subject: c05 - primality test correction for ft_is_prime and ft_find_next_prime - queens puzzle solved with backtracking (similar to rush01) --- c05/ex06/ft_is_prime.c | 14 ++++------ c05/ex07/ft_find_next_prime.c | 19 ++++++------- c05/ex08/ft_queens.c | 62 +++++++++++++++++++++++++++++++++++++++++++ c05/main.c | 12 ++++++--- 4 files changed, 83 insertions(+), 24 deletions(-) create mode 100644 c05/ex08/ft_queens.c diff --git a/c05/ex06/ft_is_prime.c b/c05/ex06/ft_is_prime.c index 3c83061..658fefb 100644 --- a/c05/ex06/ft_is_prime.c +++ b/c05/ex06/ft_is_prime.c @@ -13,7 +13,6 @@ int ft_is_prime(int nb) { long unsigned int i; - long unsigned int nbu; if (nb <= 1) return (0); @@ -21,15 +20,12 @@ int ft_is_prime(int nb) return (1); if (nb % 2 == 0 || nb % 3 == 0) return (0); - i = 1; - nbu = nb; - while (i * i <= nbu) // ne fonctionne pas de 7 a 41 + i = 5; + while (i * i <= nb) { - if (nbu % (i * 6 - 1) == 0) - return (0); - if (nbu % (i * 6 + 1) == 0) - return (0); - i += 1; + if (nb % i == 0 || nb % (i + 2) == 0) + return (0); + i += 6; } return (1); } diff --git a/c05/ex07/ft_find_next_prime.c b/c05/ex07/ft_find_next_prime.c index 80227da..d8650eb 100644 --- a/c05/ex07/ft_find_next_prime.c +++ b/c05/ex07/ft_find_next_prime.c @@ -10,10 +10,10 @@ /* */ /* ************************************************************************** */ -int is_prime(int nb) + +static int is_prime(int nb) { long unsigned int i; - long unsigned int nbu; if (nb <= 1) return (0); @@ -21,20 +21,17 @@ int is_prime(int nb) return (1); if (nb % 2 == 0 || nb % 3 == 0) return (0); - i = 1; - nbu = nb; - while (i * i <= nbu) + i = 5; + while (i * i <= nb) { - if (nbu % (i * 6 - 1) == 0) - return (0); - if (nbu % (i * 6 + 1) == 0) - return (0); - i += 1; + if (nb % i == 0 || nb % (i + 2) == 0) + return (0); + i += 6; } return (1); } -int ft_find_next_prime(int nb) +int ft_find_next_prime(int nb) { while (!is_prime(nb)) nb++; diff --git a/c05/ex08/ft_queens.c b/c05/ex08/ft_queens.c new file mode 100644 index 0000000..ba2c742 --- /dev/null +++ b/c05/ex08/ft_queens.c @@ -0,0 +1,62 @@ +#include +#define TRUE 1 +#define FALSE 0 +#define BOARD_SIZE 10 +#define ABS(x) (x < 0 ? -(x) : x) + +void ft_putchar(char c) +{ + write(1, &c, 1); +} + +static void print_cols(int cols[BOARD_SIZE]) +{ + int i; + + i = 0; + while (i < BOARD_SIZE) + ft_putchar(cols[i++] + '0'); // maybe +1 + ft_putchar('\n'); +} + +static int valid_position(int cols[BOARD_SIZE], int x, int y) +{ + int i; + + i = 0; + while (i < x) + { + if (y == cols[i]) + return (FALSE); + if (ABS(x - i) == ABS(y - cols[i])) + return (FALSE); + i++; + } + return (TRUE); +} + +static void solve(int cols[BOARD_SIZE], int x) +{ + int i; + + if (x == BOARD_SIZE) + { + print_cols(cols); + return ; + } + i = -1; + while (++i < BOARD_SIZE) + { + if (!valid_position(cols, x, i)) + continue ; + cols[x] = i; + solve(cols, x + 1); + } +} + +void ft_queens(void) // may have bad name +{ + int cols[BOARD_SIZE]; + + solve(cols, 0); +} diff --git a/c05/main.c b/c05/main.c index bdb7ad7..f66caf9 100644 --- a/c05/main.c +++ b/c05/main.c @@ -9,6 +9,7 @@ #include "ex05/ft_sqrt.c" #include "ex06/ft_is_prime.c" #include "ex07/ft_find_next_prime.c" +#include "ex08/ft_queens.c" int main() { @@ -81,10 +82,10 @@ int main() printf("prime(%d) = %d\n", 899, ft_is_prime(899)); printf("prime(%d) = %d\n", 289, ft_is_prime(289)); printf("prime(%d) = %d\n", 2147483424, ft_is_prime(2147483424)); - /*for (int i = INT_MAX; i > INT_MAX - 1000000; i--)*/ - /*printf("%d is %d\n", i, ft_is_prime(i));*/ - for (int i = 3; i <= 41; i++) - printf("%d is %d\n", i, ft_is_prime(i)); + // for (int i = INT_MAX; i > INT_MAX - 1000000; i--) + // printf("%d is %d\n", i, ft_is_prime(i)); + // for (int i = 3; i <= 41; i++) + // printf("%d is %d\n", i, ft_is_prime(i)); printf("---------------------\n"); printf("nextp(%d) = %d\n", 21, ft_find_next_prime(21)); @@ -93,4 +94,7 @@ int main() printf("nextp(%d) = %d\n", 2147483600, ft_find_next_prime(2147483600)); /*for (int i = INT_MAX; i > INT_MAX - 1000000; i--)*/ /*printf("%d is %d\n", i, ft_find_next_prime(i));*/ + + printf("---------------------\n"); + // ft_queens(); } -- cgit