test math

This commit is contained in:
2025-11-10 12:18:40 +05:00
parent 760fb43e62
commit 0c623d4bc5
7 changed files with 1307 additions and 3 deletions

View File

@@ -11,6 +11,8 @@ class Operation(Enum):
"""Типы операций"""
ADDITION = "сложение"
SUBTRACTION = "вычитание"
MULTIPLICATION = "умножение"
DIVISION = "деление"
class NumberSystem(Enum):
@@ -455,6 +457,164 @@ class StepByStepSolver:
return steps
def multiply_with_steps(self, num1: str, num2: str) -> List[Step]:
"""
Умножение двух чисел в n-ричной системе с пошаговым объяснением
Args:
num1: первый множитель
num2: второй множитель
Returns:
список шагов решения
"""
steps = []
# Шаг 1: Исходные данные
step1 = Step(
"Условие задачи",
f"Необходимо умножить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления",
f"{num1}{self.base}× {num2}{self.base}₎ = ?",
""
)
steps.append(step1)
# Определяем знак результата
dec1 = self.to_decimal(num1)
dec2 = self.to_decimal(num2)
num1_clean = num1.replace('-', '').upper()
num2_clean = num2.replace('-', '').upper()
# Шаг 2: Умножение через десятичную систему (простой подход)
result_dec = dec1 * dec2
result_str = self.from_decimal(result_dec)
step2 = Step(
"Преобразование в десятичную систему",
"Переводим оба числа в десятичную систему для проверки",
f"{num1}{self.base}₎ = {dec1}₍₁₀₎\n" +
f"{num2}{self.base}₎ = {dec2}₍₁₀₎",
""
)
steps.append(step2)
# Шаг 3: Умножение в десятичной системе
step3 = Step(
"Умножение в десятичной системе",
"Перемножаем числа в десятичной системе",
f"{dec1} × {dec2} = {result_dec}",
f"{result_dec}₍₁₀₎"
)
steps.append(step3)
# Шаг 4: Обратное преобразование
step4 = Step(
f"Перевод результата в {self.base}-ричную систему",
f"Переводим результат обратно в {self.base}-ричную систему",
f"{result_dec}₍₁₀₎ = {result_str}{self.base}",
f"{result_str}{self.base}"
)
steps.append(step4)
# Шаг 5: Проверка
step5 = Step(
"Итоговый результат",
f"Результат умножения {num1}{self.base}× {num2}{self.base}",
f"{num1}{self.base}× {num2}{self.base}₎ = {result_str}{self.base}\nПроверка: {dec1} × {dec2} = {result_dec}",
f"✓ Ответ: {result_str}{self.base}"
)
steps.append(step5)
return steps
def divide_with_steps(self, num1: str, num2: str) -> List[Step]:
"""
Деление двух чисел в n-ричной системе с пошаговым объяснением
Args:
num1: делимое
num2: делитель
Returns:
список шагов решения
"""
steps = []
# Шаг 1: Исходные данные
step1 = Step(
"Условие задачи",
f"Необходимо разделить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления",
f"{num1}{self.base}₎ ÷ {num2}{self.base}₎ = ?",
""
)
steps.append(step1)
# Проверка деления на ноль
dec2 = self.to_decimal(num2)
if dec2 == 0:
step_error = Step(
"Ошибка",
"Деление на ноль невозможно!",
"",
"❌ Деление на ноль"
)
steps.append(step_error)
return steps
dec1 = self.to_decimal(num1)
num1_clean = num1.replace('-', '').upper()
num2_clean = num2.replace('-', '').upper()
# Шаг 2: Преобразование в десятичную систему
step2 = Step(
"Преобразование в десятичную систему",
"Переводим оба числа в десятичную систему",
f"{num1}{self.base}₎ = {dec1}₍₁₀₎\n" +
f"{num2}{self.base}₎ = {dec2}₍₁₀₎",
""
)
steps.append(step2)
# Шаг 3: Деление в десятичной системе (целочисленное)
quotient = dec1 // dec2
remainder = dec1 % dec2
step3 = Step(
"Деление в десятичной системе",
"Выполняем целочисленное деление в десятичной системе",
f"{dec1} ÷ {dec2} = {quotient} (остаток {remainder})",
f"Частное: {quotient}₍₁₀₎, Остаток: {remainder}₍₁₀₎"
)
steps.append(step3)
# Шаг 4: Обратное преобразование
quotient_str = self.from_decimal(quotient)
remainder_str = self.from_decimal(remainder) if remainder != 0 else "0"
step4 = Step(
f"Перевод результата в {self.base}-ричную систему",
f"Переводим частное и остаток обратно в {self.base}-ричную систему",
f"Частное: {quotient}₍₁₀₎ = {quotient_str}{self.base}\n" +
f"Остаток: {remainder}₍₁₀₎ = {remainder_str}{self.base}",
f"{quotient_str}{self.base}₎ (остаток {remainder_str}{self.base}₎)"
)
steps.append(step4)
# Шаг 5: Проверка
check_result = dec2 * quotient + remainder
step5 = Step(
"Проверка результата",
"Проверяем: делитель × частное + остаток = делимое",
f"{dec2} × {quotient} + {remainder} = {check_result}\n" +
f"{num2}{self.base}× {quotient_str}{self.base}₎ + {remainder_str}{self.base}₎ = {num1}{self.base}",
f"✓ Ответ: {quotient_str}{self.base}₎ (остаток {remainder_str}{self.base}₎)" if remainder != 0 else f"✓ Ответ: {quotient_str}{self.base}"
)
steps.append(step5)
return steps
def solve(self, num1: str, num2: str, operation: Operation) -> List[Step]:
"""
Решить задачу с пошаговым объяснением
@@ -462,7 +622,7 @@ class StepByStepSolver:
Args:
num1: первое число
num2: второе число
operation: тип операции (сложение/вычитание)
operation: тип операции (сложение/вычитание/умножение/деление)
Returns:
список шагов решения
@@ -471,6 +631,10 @@ class StepByStepSolver:
return self.add_with_steps(num1, num2)
elif operation == Operation.SUBTRACTION:
return self.subtract_with_steps(num1, num2)
elif operation == Operation.MULTIPLICATION:
return self.multiply_with_steps(num1, num2)
elif operation == Operation.DIVISION:
return self.divide_with_steps(num1, num2)
else:
raise ValueError(f"Неподдерживаемая операция: {operation}")