From 064a2db2eeb1b0f0df25596966e108a12ce2e415 Mon Sep 17 00:00:00 2001 From: chatlanin Date: Fri, 7 Mar 2025 09:51:53 +0300 Subject: [PATCH] add gcd and prime factors --- .gitignore | 4 +++ README.md | 1 + bin/main.cpp | 19 +++++++++++ bin/meson.build | 8 +++++ meson.build | 37 ++++++++++++++++++++++ run.sh | 29 +++++++++++++++++ src/meson.build | 24 ++++++++++++++ src/numbers/gcd.hpp | 18 +++++++++++ src/numbers/prime_factors.hpp | 59 +++++++++++++++++++++++++++++++++++ subprojects/hack.wrap | 7 +++++ 10 files changed, 206 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 bin/main.cpp create mode 100644 bin/meson.build create mode 100644 meson.build create mode 100755 run.sh create mode 100644 src/meson.build create mode 100644 src/numbers/gcd.hpp create mode 100644 src/numbers/prime_factors.hpp create mode 100644 subprojects/hack.wrap diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f50645 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +build +.cache +subprojects/* +!subprojects/*.wrap diff --git a/README.md b/README.md new file mode 100644 index 0000000..3a3add1 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Рабочий проект по изучению и анализу всяких там умных и не очень алгоритмов. diff --git a/bin/main.cpp b/bin/main.cpp new file mode 100644 index 0000000..8f408a4 --- /dev/null +++ b/bin/main.cpp @@ -0,0 +1,19 @@ +#include + +#include "numbers/gcd.hpp" +#include "numbers/prime_factors.hpp" + +auto main() -> int +{ + hack::log()(algorithms::gcd(4851, 3003)); + hack::log()(algorithms::gcd(64, 28)); + + hack::log()(algorithms::prime_factors_v1(127)); + hack::log()(algorithms::prime_factors_v1(128)); + hack::log()(algorithms::prime_factors_v1(130)); + + hack::log()(algorithms::prime_factors_v2(127)); + hack::log()(algorithms::prime_factors_v2(128)); + hack::log()(algorithms::prime_factors_v2(130)); +} + diff --git a/bin/meson.build b/bin/meson.build new file mode 100644 index 0000000..f6ed8ee --- /dev/null +++ b/bin/meson.build @@ -0,0 +1,8 @@ +executable( + meson.project_name(), + 'main.cpp', + dependencies : deps, + cpp_args: args, + include_directories : inc +) + diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..a110431 --- /dev/null +++ b/meson.build @@ -0,0 +1,37 @@ +project( + meson.current_source_dir().split('/').get(-1), + 'cpp', + version : run_command('git', 'rev-parse', '--short', 'HEAD', check: false).stdout().strip(), + default_options : [ + 'warning_level=1', + 'optimization=3', + 'cpp_std=c++20', +]) + +add_project_arguments ( + '-Wpedantic', + '-Wno-shadow', + '-Wno-unused-but-set-variable', + '-Wno-comment', + '-Wno-unused-parameter', + '-Wno-unused-value', + '-Wno-missing-field-initializers', + '-Wno-narrowing', + '-Wno-deprecated-enum-enum-conversion', + '-Wno-volatile', + '-Wno-format-security', + '-Wno-switch', + '-Wno-ignored-attributes', + '-Wno-unused-variable', + '-Wno-deprecated-enum-enum-conversion', + language: 'cpp' +) + +args = [] +inc = [] +deps = [ + subproject('hack').get_variable('hack_dep') +] + +subdir('src') +subdir('bin') diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..dd4589e --- /dev/null +++ b/run.sh @@ -0,0 +1,29 @@ +#!/bin/zsh + +PROJECT_NAME=$(basename $PWD) + +run() { + command meson compile -C build + cd build + ./bin/$PROJECT_NAME + cd .. +} + +# run test [name_test] +# example: run test pattrens +if [[ "$1" == "test" ]]; then + echo "" + meson test $2 -C build + echo "" + awk '/^-------------------------------------------------------------------------------/{flag=1} /===============================================================================/{flag=0} flag' ./build/meson-logs/testlog.txt +elif [[ "$1" == "tests" ]]; then + echo "" + meson test -C build + echo "" + # awk '/^-------------------------------------------------------------------------------/{flag=1} /===============================================================================/{flag=0} flag' ./build/meson-logs/testlog.txt +elif [[ -d "build" ]]; then + run +else + command meson setup build + run +fi diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..9622a56 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,24 @@ +inc += include_directories('.') + +headers = [ + 'numbers/gcd.hpp', + 'numbers/prime_factors.hpp' +] + +sources = [ +] + +lib = library( + meson.project_name(), + include_directories : inc, + sources: [headers, sources], + dependencies : deps, + cpp_args: args +) + +dsp_sdk_dep = declare_dependency( + include_directories: inc, + link_with: lib +) + +deps += dsp_sdk_dep diff --git a/src/numbers/gcd.hpp b/src/numbers/gcd.hpp new file mode 100644 index 0000000..be950d7 --- /dev/null +++ b/src/numbers/gcd.hpp @@ -0,0 +1,18 @@ +#pragma once + +// Называется алгоритм Евклида +// Находит наибольший общий делитель +namespace algorithms +{ + inline int gcd(int a, int b) + { + while (b != 0) + { + int r = a%b; + a = b; + b = r; + } + + return a; + } +} diff --git a/src/numbers/prime_factors.hpp b/src/numbers/prime_factors.hpp new file mode 100644 index 0000000..3f8abb2 --- /dev/null +++ b/src/numbers/prime_factors.hpp @@ -0,0 +1,59 @@ +#pragma once + +#include +#include + +// Находит все простые множители заданного числа. +// Простое число - это число > 1, которое делится на 1 и на само себя. +namespace algorithms +{ + inline std::vector prime_factors_v1(int a) + { + std::vector result; + int i = 2; + + while (i < a) + { + while (a%i == 0) + { + result.push_back(i); + a /= i; + } + ++i; + } + + if (a > 1) result.push_back(a); + + return result; + } + + inline std::vector prime_factors_v2(int a) + { + std::vector result; + + while(a%2 == 0) + { + result.push_back(2); + a = a/2; + } + + int i = 3; + int max_faxtor = std::sqrt(a); + + while (i <= max_faxtor) + { + while (a%i == 0) + { + result.push_back(i); + a /= i; + max_faxtor = std::sqrt(a); + } + i += 2; + } + + if (a > 1) result.push_back(a); + + return result; + } + +} diff --git a/subprojects/hack.wrap b/subprojects/hack.wrap new file mode 100644 index 0000000..23519f6 --- /dev/null +++ b/subprojects/hack.wrap @@ -0,0 +1,7 @@ +[wrap-git] +url = https://gitcast.ru/chatlanin/hack.git +revision = master + +[provide] +hack = hack_dep +