From 76879cebf0fe3091f7b417b4dd886ce6d4e9ca26 Mon Sep 17 00:00:00 2001 From: Artem-Darius Weber Date: Thu, 17 Apr 2025 17:51:05 +0300 Subject: [PATCH] =?UTF-8?q?(lab=205)=20feat:=20task-16-method-2:=20=D0=94?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20=D0=BC?= =?UTF-8?q?=D0=B8=D0=BD=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BD=D0=B5=D1=87=D0=B5=D1=82=D0=BD=D0=BE=D0=B9=20=D1=86=D0=B8?= =?UTF-8?q?=D1=84=D1=80=D1=8B=20=D1=87=D0=B8=D1=81=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab 5/NumberOperationsAdvanced/Program.fs | 109 ++++++++++++++++++++-- 1 file changed, 99 insertions(+), 10 deletions(-) diff --git a/lab 5/NumberOperationsAdvanced/Program.fs b/lab 5/NumberOperationsAdvanced/Program.fs index 9729e4e..edc0ec4 100644 --- a/lab 5/NumberOperationsAdvanced/Program.fs +++ b/lab 5/NumberOperationsAdvanced/Program.fs @@ -16,7 +16,27 @@ let countDivisorsNotDivisibleByThree (n: int) = if n <= 0 then 0 else countDivisors 1 0 -// method test +// Метод 2: Найти минимальную нечетную цифру числа +let findMinOddDigit (n: int) = + // Вспомогательная функция для поиска минимальной нечетной цифры с использованием хвостовой рекурсии + let rec findMin number minDigit = + if number = 0 then + minDigit + else + let digit = number % 10 + let newMin = + if digit % 2 <> 0 && (minDigit = -1 || digit < minDigit) then + digit + else + minDigit + findMin (number / 10) newMin + + if n < 0 then + findMin (abs n) -1 + else + findMin n -1 + +// method test 1 let testCountDivisorsNotDivisibleByThree () = let testCases = [1; 3; 6; 9; 10; 12; 15; 20; 30] @@ -34,23 +54,58 @@ let testCountDivisorsNotDivisibleByThree () = printfn " Результат: %d (ожидаемый: %d) - %s" result expected (if result = expected then "OK" else "ОШИБКА") printfn "" +// method test 2 +let testFindMinOddDigit () = + let testCases = [0; 2; 8; 13; 25; 42; 123; 456; 789; 2468; 1359; 12345] + + printfn "Тестирование метода 2: Минимальная нечетная цифра числа" + for n in testCases do + let digits = + n.ToString() + |> Seq.map (fun c -> int c - int '0') + |> Seq.toList + + let oddDigits = digits |> List.filter (fun d -> d % 2 <> 0) + + let expected = + if oddDigits.IsEmpty then -1 + else List.min oddDigits + + let result = findMinOddDigit n + + printfn "n = %d:" n + printfn " Цифры: %A" digits + printfn " Нечетные цифры: %A" oddDigits + printfn " Минимальная нечетная цифра: %d (ожидаемая: %d) - %s" + result expected (if result = expected then "OK" else "ОШИБКА") + printfn "" + [] let main argv = Console.OutputEncoding <- Text.Encoding.UTF8 - printfn "Задание 16. Вариант № 5. Метод 1: Найти количество делителей числа, не делящихся на 3.\n" + printfn "Задание 16. Вариант № 5." + printfn "Метод 1: Найти количество делителей числа, не делящихся на 3." + printfn "Метод 2: Найти минимальную нечетную цифру числа.\n" + printfn "=== Тестирование Метода 1 ===" testCountDivisorsNotDivisibleByThree() + printfn "=== Тестирование Метода 2 ===" + testFindMinOddDigit() + printfn "Интерактивный режим:" let rec processUserInput () = - printf "Введите число для вычисления количества делителей, не делящихся на 3 (или 'q' для выхода): " - let input = Console.ReadLine() + printfn "Выберите метод:" + printfn "1 - Количество делителей числа, не делящихся на 3" + printfn "2 - Минимальная нечетная цифра числа" + printfn "q - Выход" - match input.ToLower() with - | "q" | "quit" | "exit" -> () - | _ -> - match Int32.TryParse(input) with + printf "Ваш выбор: " + match Console.ReadLine().ToLower() with + | "1" -> + printf "Введите число: " + match Int32.TryParse(Console.ReadLine()) with | true, n when n > 0 -> let result = countDivisorsNotDivisibleByThree n let divisors = [1..n] |> List.filter (fun i -> n % i = 0) @@ -61,10 +116,44 @@ let main argv = printfn "Делители, не делящиеся на 3: %A" divisorsNotDivByThree printfn "Количество делителей, не делящихся на 3: %d" result printfn "" - processUserInput () | _ -> printfn "Некорректный ввод. Пожалуйста, введите положительное целое число.\n" - processUserInput () + + processUserInput () + + | "2" -> + printf "Введите число: " + match Int32.TryParse(Console.ReadLine()) with + | true, n -> + let result = findMinOddDigit n + + printfn "Число: %d" n + + let digits = + (abs n).ToString() + |> Seq.map (fun c -> int c - int '0') + |> Seq.toList + + let oddDigits = digits |> List.filter (fun d -> d % 2 <> 0) + + printfn "Цифры: %A" digits + printfn "Нечетные цифры: %A" oddDigits + + if result = -1 then + printfn "В числе нет нечетных цифр." + else + printfn "Минимальная нечетная цифра: %d" result + + printfn "" + | _ -> + printfn "Некорректный ввод. Пожалуйста, введите целое число.\n" + + processUserInput () + + | "q" | "quit" | "exit" -> () + | _ -> + printfn "Некорректный выбор. Пожалуйста, выберите 1, 2 или q." + processUserInput () processUserInput () 0 \ No newline at end of file