From eb3655dcb6c6ee1030582e07a0b0aa6eb51ecd2e Mon Sep 17 00:00:00 2001 From: EdouardParis <mail@edouard.paris> Date: Tue, 31 May 2016 18:07:07 +0200 Subject: [PATCH] Question 9 --- src/Makefile | 5 ++++- src/question_9.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/test.sh | 22 ++++++++++++++++++++-- 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 src/question_9.cpp diff --git a/src/Makefile b/src/Makefile index 922faf6..8628c30 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,4 +1,4 @@ -all: question_3 question_5 +all: question_3 question_5 question_9 question_3: question_3.cpp g++ -o ./bin/question_3 question_3.cpp -Wall -Wextra -lgmp -lgmpxx @@ -6,6 +6,9 @@ question_3: question_3.cpp question_5: question_5.cpp g++ -o ./bin/question_5 question_5.cpp -Wall -Wextra -lgmp -lgmpxx +question_9: question_9.cpp + g++ -o ./bin/question_9 question_9.cpp -Wall -Wextra -lgmp -lgmpxx + test: ./test.sh diff --git a/src/question_9.cpp b/src/question_9.cpp new file mode 100644 index 0000000..bfbe25d --- /dev/null +++ b/src/question_9.cpp @@ -0,0 +1,44 @@ +/*Projet Edouard Paris 2016 - Arithmetique entière + * + * Question 9 + * */ + +#include <iostream> +#include <cstdlib> +#include <gmpxx.h> +#include <cassert> + +void algo_k_root(mpz_class const& a, long const k, mpz_class & res) +{ + mpz_class r1 = a + 1; + mpz_class r2 = a; + mpz_class r3 = a; + + while (r2 < r1 && r2 != 0) { + r1 = r2; + mpz_pow_ui(r3.get_mpz_t(), r1.get_mpz_t(), (k-1)); + r2 = (r1*(k - 1) + (a / r3))/k; + } + + mpz_pow_ui(r3.get_mpz_t(), r2.get_mpz_t(), k); + + if ((a - r3) < 0) { + res = r2 - 1; + } else { + res = r2; + } +}; + +int main(int argc, char** argv) { + assert(argc == 3); + long n = strtol(argv[1], NULL, 10); + long k = strtol(argv[2], NULL, 10); + + mpz_class a(n); + mpz_class res; + + algo_k_root(a, k, res); + + std::cout << res << std::endl; + return 0; +} diff --git a/src/test.sh b/src/test.sh index 2b1de82..b4325b7 100755 --- a/src/test.sh +++ b/src/test.sh @@ -2,15 +2,33 @@ test () { var=`./bin/question_3 $1`; if [ $var == $2 ]; then - echo "SUCCESS $1 $var" + echo "SUCCESS $1 = $var^2" else - echo "FAIL $1 EXPECTING $2 GET $var" + echo "FAIL $1 = $2^2 GET $var^2" fi } +test2 () { + var=`./bin/question_9 $1 $2`; + if [ $var == $3 ]; then + echo "SUCCESS $1 = $var^$2" + else + echo "FAIL $1 = $3^$2 GET $var^$2" + fi +} + + test 10 3 test 48 6 test 49 7 test 50 7 test 100 10 test 1000 31 + + + +test2 10 3 2 +test2 1000 3 10 +test2 15625 6 5 +test2 15624 6 4 +test2 15626 6 5 -- GitLab