finaly
This commit is contained in:
@@ -155,7 +155,8 @@ class StepByStepSolver:
|
||||
step1 = Step(
|
||||
"Исходные данные",
|
||||
f"Необходимо преобразовать число {number} из {self.get_system_name()} " +
|
||||
f"({self.base}-ричной) системы в {target_base}-ричную систему",
|
||||
f"({self.base}-ричной) системы в {target_base}-ричную систему.\n" +
|
||||
f"Это как перевод с одного языка на другой - число остаётся тем же, меняется только способ записи!",
|
||||
f"Исходное число: {'-' if is_negative else ''}{number}₍{self.base}₎"
|
||||
)
|
||||
steps.append(step1)
|
||||
@@ -164,20 +165,39 @@ class StepByStepSolver:
|
||||
if self.base != 10:
|
||||
decimal_value = 0
|
||||
calculation = []
|
||||
position_table = []
|
||||
|
||||
# Создаём таблицу разрядов
|
||||
digits_list = list(reversed(number))
|
||||
position_table.append("┌─" + "─┬─".join(["─"*5 for _ in digits_list]) + "─┐")
|
||||
position_table.append("│ " + " │ ".join([f"Поз {i}" for i in range(len(digits_list))]) + " │")
|
||||
position_table.append("├─" + "─┼─".join(["─"*5 for _ in digits_list]) + "─┤")
|
||||
position_table.append("│ " + " │ ".join([f"{self.base}^{i}={self.base**i}".center(5) for i in range(len(digits_list))]) + " │")
|
||||
position_table.append("├─" + "─┼─".join(["─"*5 for _ in digits_list]) + "─┤")
|
||||
position_table.append("│ " + " │ ".join([f"{d}".center(5) for d in digits_list]) + " │")
|
||||
position_table.append("└─" + "─┴─".join(["─"*5 for _ in digits_list]) + "─┘")
|
||||
|
||||
for i, digit in enumerate(reversed(number)):
|
||||
digit_value = self.digits.index(digit)
|
||||
power = self.base ** i
|
||||
term_value = digit_value * power
|
||||
decimal_value += term_value
|
||||
calculation.append(f"{digit}×{self.base}^{i} = {digit_value}×{power} = {term_value}")
|
||||
calculation.append(f"Позиция {i}: {digit} × {self.base}^{i} = {digit_value} × {power} = {term_value}")
|
||||
|
||||
visual = "\n".join(calculation)
|
||||
visual += f"\n\nСумма: {' + '.join([str(digit_value * (self.base ** i)) for i, digit in enumerate(reversed(number)) for digit_value in [self.digits.index(digit)]])} = {decimal_value}"
|
||||
visual = "\n".join(position_table)
|
||||
visual += "\n\nПОШАГОВЫЙ РАСЧЁТ:\n"
|
||||
visual += "Каждая позиция (справа налево) имеет свой \"вес\" - степень основания.\n"
|
||||
visual += f"В {self.base}-ричной системе веса позиций: 1, {self.base}, {self.base**2}, {self.base**3}...\n\n"
|
||||
visual += "\n".join(calculation)
|
||||
|
||||
sum_parts = [str(self.digits.index(digit) * (self.base ** i)) for i, digit in enumerate(reversed(number))]
|
||||
visual += f"\n\nИТОГОВАЯ СУММА: {' + '.join(sum_parts)} = {decimal_value}"
|
||||
|
||||
step2 = Step(
|
||||
"Перевод в десятичную систему",
|
||||
f"Каждую цифру умножаем на {self.base} в степени её позиции (справа налево, начиная с 0)",
|
||||
f"Представьте, что каждая позиция - это \"кармашек\" с определённой ценностью.\n" +
|
||||
f"Самый правый \"стоит\" 1, следующий - {self.base}, потом {self.base**2} и так далее.\n" +
|
||||
f"Мы умножаем цифру на \"цену\" её позиции и складываем всё вместе.",
|
||||
visual,
|
||||
f"{decimal_value}₍₁₀₎"
|
||||
)
|
||||
@@ -190,23 +210,35 @@ class StepByStepSolver:
|
||||
divisions = []
|
||||
temp = decimal_value
|
||||
result_digits = []
|
||||
step_num = 1
|
||||
|
||||
visual = f"МЕТОД: Делим число на {target_base} до тех пор, пока не получим 0.\n"
|
||||
visual += "Каждый остаток от деления - это одна цифра результата.\n"
|
||||
visual += "Важно! Первый остаток будет ПОСЛЕДНЕЙ цифрой ответа.\n\n"
|
||||
|
||||
while temp > 0:
|
||||
remainder = temp % target_base
|
||||
quotient = temp // target_base
|
||||
result_digits.insert(0, self.digits[remainder])
|
||||
divisions.append(f"{temp} ÷ {target_base} = {quotient}, остаток: {remainder} ({self.digits[remainder]})")
|
||||
divisions.append(f"Шаг {step_num}: {temp} ÷ {target_base} = {quotient}, остаток: {remainder} → цифра '{self.digits[remainder]}'")
|
||||
step_num += 1
|
||||
temp = quotient
|
||||
|
||||
result_number = ''.join(result_digits) if result_digits else "0"
|
||||
|
||||
visual = "\n".join(divisions)
|
||||
visual += f"\n\nЧитаем остатки снизу вверх: {result_number}"
|
||||
visual += "\n".join(divisions)
|
||||
visual += "\n\n" + "="*50
|
||||
visual += f"\nСобираем остатки СНИЗУ ВВЕРХ (от последнего к первому):\n"
|
||||
visual += "═"*50 + "\n"
|
||||
for i, digit in enumerate(result_digits):
|
||||
visual += f" ↑ {digit} "
|
||||
visual += f"\n\nОтвет: {result_number}"
|
||||
|
||||
step3 = Step(
|
||||
f"Перевод в {target_base}-ричную систему",
|
||||
f"Делим число на {target_base} и записываем остатки. " +
|
||||
"Читаем остатки снизу вверх",
|
||||
f"Алгоритм деления с остатком - классический способ перевода.\n" +
|
||||
f"Представьте, что вы раскладываете конфеты по коробкам: в каждой {target_base} штук.\n" +
|
||||
f"Остатки показывают, сколько конфет не поместилось в полные коробки на каждом этапе.",
|
||||
visual,
|
||||
f"{'-' if is_negative else ''}{result_number}₍{target_base}₎"
|
||||
)
|
||||
@@ -240,10 +272,12 @@ class StepByStepSolver:
|
||||
"""
|
||||
steps = []
|
||||
|
||||
# Шаг 1: Исходные данные
|
||||
# Шаг 1: Условие задачи
|
||||
step1 = Step(
|
||||
"Условие задачи",
|
||||
f"Необходимо сложить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления",
|
||||
f"Необходимо сложить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления.\n" +
|
||||
f"Принцип такой же, как в десятичной системе, но \"переполнение\" происходит при {self.base}, а не при 10!\n" +
|
||||
f"Пример: если в десятичной 9+1=10 (переносим 1), то в двоичной 1+1=10₍₂₎ (тоже переносим 1).",
|
||||
f"{num1}₍{self.base}₎ + {num2}₍{self.base}₎ = ?",
|
||||
""
|
||||
)
|
||||
@@ -310,8 +344,11 @@ class StepByStepSolver:
|
||||
|
||||
step3 = Step(
|
||||
"Сложение в столбик",
|
||||
f"Складываем числа справа налево, учитывая переносы. " +
|
||||
f"При сумме ≥ {self.base} делим на {self.base}: остаток - результат, частное - перенос",
|
||||
f"Складываем числа справа налево, учитывая переносы.\n" +
|
||||
f"ПРАВИЛО: Если сумма ≥ {self.base}, то делим на {self.base}:\n" +
|
||||
f" • Остаток от деления → записываем в результат\n" +
|
||||
f" • Частное → переносим в следующий разряд\n" +
|
||||
f"Например: если {self.base-1} + 1 = {self.base}, пишем 0 и переносим 1 (как 9+1=10 в десятичной).",
|
||||
visual,
|
||||
f"{result_str}₍{self.base}₎"
|
||||
)
|
||||
@@ -348,10 +385,13 @@ class StepByStepSolver:
|
||||
"""
|
||||
steps = []
|
||||
|
||||
# Шаг 1: Исходные данные
|
||||
# Шаг 1: Условие задачи
|
||||
step1 = Step(
|
||||
"Условие задачи",
|
||||
f"Необходимо вычесть два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления",
|
||||
f"Необходимо вычесть два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления.\n" +
|
||||
f"Вычитание работает как в десятичной, но занимаем не 10, а {self.base}.\n" +
|
||||
f"Например: в десятичной при 3-5 занимаем 10, получается 13-5=8.\n" +
|
||||
f"В {self.base}-ричной системе занимаем {self.base} из следующего разряда.",
|
||||
f"{num1}₍{self.base}₎ - {num2}₍{self.base}₎ = ?",
|
||||
""
|
||||
)
|
||||
@@ -434,8 +474,12 @@ class StepByStepSolver:
|
||||
|
||||
step3 = Step(
|
||||
"Вычитание в столбик",
|
||||
f"Вычитаем числа справа налево. " +
|
||||
f"Если цифра уменьшаемого меньше вычитаемого, занимаем {self.base} из следующего разряда",
|
||||
f"Вычитаем числа справа налево.\n" +
|
||||
f"ПРАВИЛО ЗАИМСТВОВАНИЯ:\n" +
|
||||
f" • Если верхняя цифра < нижней, занимаем {self.base} из следующего разряда\n" +
|
||||
f" • К верхней цифре прибавляем {self.base}, вычитаем нижнюю\n" +
|
||||
f" • Из следующего разряда вычитаем 1 (это \"долг\")\n" +
|
||||
f"Это как занять 10₽ у друга, чтобы хватило на покупку!",
|
||||
visual,
|
||||
f"{result_str}₍{self.base}₎"
|
||||
)
|
||||
@@ -473,7 +517,13 @@ class StepByStepSolver:
|
||||
# Шаг 1: Исходные данные
|
||||
step1 = Step(
|
||||
"Условие задачи",
|
||||
f"Необходимо умножить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления",
|
||||
f"Необходимо умножить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления.\n" +
|
||||
f"\nСПОСОБ РЕШЕНИЯ:\n" +
|
||||
f"Умножение напрямую в {self.base}-ричной системе сложное, поэтому используем \"переводчика\":\n" +
|
||||
f" 1. Переводим оба числа в привычную десятичную систему\n" +
|
||||
f" 2. Умножаем в десятичной системе (это мы умеем!)\n" +
|
||||
f" 3. Переводим результат обратно в {self.base}-ричную систему\n" +
|
||||
f"Это как перевести иностранный текст на русский, решить задачу и перевести ответ обратно.",
|
||||
f"{num1}₍{self.base}₎ × {num2}₍{self.base}₎ = ?",
|
||||
""
|
||||
)
|
||||
@@ -491,37 +541,50 @@ class StepByStepSolver:
|
||||
result_str = self.from_decimal(result_dec)
|
||||
|
||||
step2 = Step(
|
||||
"Преобразование в десятичную систему",
|
||||
"Переводим оба числа в десятичную систему для проверки",
|
||||
"Шаг 1: Преобразование в десятичную систему",
|
||||
f"Переводим множители из {self.base}-ричной в десятичную систему.\n" +
|
||||
f"Используем метод разложения по разрядам (см. примеры выше).",
|
||||
f"{num1}₍{self.base}₎ = {dec1}₍₁₀₎\n" +
|
||||
f"{num2}₍{self.base}₎ = {dec2}₍₁₀₎",
|
||||
""
|
||||
f"{num2}₍{self.base}₎ = {dec2}₍₁₀₎\n\n" +
|
||||
f"Теперь работаем с привычными десятичными числами!",
|
||||
f"Множители: {dec1} и {dec2}"
|
||||
)
|
||||
steps.append(step2)
|
||||
|
||||
# Шаг 3: Умножение в десятичной системе
|
||||
step3 = Step(
|
||||
"Умножение в десятичной системе",
|
||||
"Перемножаем числа в десятичной системе",
|
||||
f"{dec1} × {dec2} = {result_dec}",
|
||||
"Шаг 2: Умножение в десятичной системе",
|
||||
f"Перемножаем числа обычным способом (как учили в школе).\n" +
|
||||
f"Это самая простая часть - обычное умножение!",
|
||||
f"{dec1} × {dec2} = {result_dec}\n\n" +
|
||||
f"Получили результат в десятичной системе: {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"Шаг 3: Перевод результата в {self.base}-ричную систему",
|
||||
f"Переводим полученный результат обратно в {self.base}-ричную систему.\n" +
|
||||
f"Используем метод деления с остатком (см. примеры выше).",
|
||||
f"{result_dec}₍₁₀₎ = {result_str}₍{self.base}₎\n\n" +
|
||||
f"Вернули ответ в исходную систему счисления!",
|
||||
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"Проверяем логику решения:\n" +
|
||||
f" • Исходная задача: {num1}₍{self.base}₎ × {num2}₍{self.base}₎\n" +
|
||||
f" • Перевели в десятичную: {dec1} × {dec2}\n" +
|
||||
f" • Получили результат: {result_dec}\n" +
|
||||
f" • Вернули в {self.base}-ричную: {result_str}₍{self.base}₎",
|
||||
f"┌─────────────────────────────────┐\n" +
|
||||
f"│ {num1}₍{self.base}₎ × {num2}₍{self.base}₎ = {result_str}₍{self.base}₎ │\n" +
|
||||
f"└─────────────────────────────────┘\n" +
|
||||
f"Проверка: {dec1} × {dec2} = {result_dec}₍₁₀₎ = {result_str}₍{self.base}₎",
|
||||
f"✓ Ответ: {result_str}₍{self.base}₎"
|
||||
)
|
||||
steps.append(step5)
|
||||
@@ -544,7 +607,13 @@ class StepByStepSolver:
|
||||
# Шаг 1: Исходные данные
|
||||
step1 = Step(
|
||||
"Условие задачи",
|
||||
f"Необходимо разделить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления",
|
||||
f"Необходимо разделить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления.\n" +
|
||||
f"\nСПОСОБ РЕШЕНИЯ:\n" +
|
||||
f"Деление в {self.base}-ричной системе очень трудоёмкое, поэтому используем метод \"переводчика\":\n" +
|
||||
f" 1. Переводим делимое и делитель в десятичную систему\n" +
|
||||
f" 2. Делим в десятичной системе (получаем частное и остаток)\n" +
|
||||
f" 3. Переводим частное и остаток обратно в {self.base}-ричную систему\n" +
|
||||
f"Проще решить на \"родном языке\" математики - в десятичной системе!",
|
||||
f"{num1}₍{self.base}₎ ÷ {num2}₍{self.base}₎ = ?",
|
||||
""
|
||||
)
|
||||
@@ -569,11 +638,13 @@ class StepByStepSolver:
|
||||
|
||||
# Шаг 2: Преобразование в десятичную систему
|
||||
step2 = Step(
|
||||
"Преобразование в десятичную систему",
|
||||
"Переводим оба числа в десятичную систему",
|
||||
f"{num1}₍{self.base}₎ = {dec1}₍₁₀₎\n" +
|
||||
f"{num2}₍{self.base}₎ = {dec2}₍₁₀₎",
|
||||
""
|
||||
"Шаг 1: Преобразование в десятичную систему",
|
||||
f"Переводим делимое и делитель из {self.base}-ричной в десятичную систему.\n" +
|
||||
f"Используем знакомый метод разложения по разрядам.",
|
||||
f"Делимое: {num1}₍{self.base}₎ = {dec1}₍₁₀₎\n" +
|
||||
f"Делитель: {num2}₍{self.base}₎ = {dec2}₍₁₀₎\n\n" +
|
||||
f"Теперь задача выглядит просто: {dec1} ÷ {dec2}",
|
||||
f"Числа в десятичной: {dec1} ÷ {dec2}"
|
||||
)
|
||||
steps.append(step2)
|
||||
|
||||
@@ -582,9 +653,14 @@ class StepByStepSolver:
|
||||
remainder = dec1 % dec2
|
||||
|
||||
step3 = Step(
|
||||
"Деление в десятичной системе",
|
||||
"Выполняем целочисленное деление в десятичной системе",
|
||||
f"{dec1} ÷ {dec2} = {quotient} (остаток {remainder})",
|
||||
"Шаг 2: Деление в десятичной системе",
|
||||
f"Выполняем целочисленное деление (деление нацело).\n" +
|
||||
f"\nЧТО ПОЛУЧАЕМ:\n" +
|
||||
f" • Частное (сколько раз {dec2} помещается в {dec1})\n" +
|
||||
f" • Остаток (что осталось после деления)\n" +
|
||||
f"\nПример: 17 ÷ 5 = 3 (остаток 2), потому что 5×3=15, а 17-15=2",
|
||||
f"{dec1} ÷ {dec2} = {quotient} (остаток {remainder})\n\n" +
|
||||
f"Проверка: {dec2} × {quotient} + {remainder} = {dec2 * quotient} + {remainder} = {dec1} ✓",
|
||||
f"Частное: {quotient}₍₁₀₎, Остаток: {remainder}₍₁₀₎"
|
||||
)
|
||||
steps.append(step3)
|
||||
@@ -594,10 +670,12 @@ class StepByStepSolver:
|
||||
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"Шаг 3: Перевод результата в {self.base}-ричную систему",
|
||||
f"Переводим частное и остаток обратно в {self.base}-ричную систему.\n" +
|
||||
f"Используем метод деления с остатком для перевода.",
|
||||
f"Частное: {quotient}₍₁₀₎ → {quotient_str}₍{self.base}₎\n" +
|
||||
f"Остаток: {remainder}₍₁₀₎ → {remainder_str}₍{self.base}₎\n\n" +
|
||||
f"Вернули ответ в исходную систему счисления!",
|
||||
f"{quotient_str}₍{self.base}₎ (остаток {remainder_str}₍{self.base}₎)"
|
||||
)
|
||||
steps.append(step4)
|
||||
@@ -605,11 +683,18 @@ class StepByStepSolver:
|
||||
# Шаг 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}₎"
|
||||
"Итоговый результат и проверка",
|
||||
f"Проверяем правильность по формуле:\n" +
|
||||
f" Делимое = Делитель × Частное + Остаток\n" +
|
||||
f"Это основное правило деления с остатком!",
|
||||
f"┌──────────────────────────────────────┐\n" +
|
||||
f"│ {num1}₍{self.base}₎ ÷ {num2}₍{self.base}₎ = {quotient_str}₍{self.base}₎" +
|
||||
(f" (ост. {remainder_str}₍{self.base}₎)" if remainder != 0 else "") + " │\n" +
|
||||
f"└──────────────────────────────────────┘\n\n" +
|
||||
f"Проверка в десятичной: {dec2} × {quotient} + {remainder} = {check_result} ✓\n" +
|
||||
f"Проверка в {self.base}-ричной: {num2}₍{self.base}₎ × {quotient_str}₍{self.base}₎" +
|
||||
(f" + {remainder_str}₍{self.base}₎" if remainder != 0 else "") + f" = {num1}₍{self.base}₎ ✓",
|
||||
f"✓ Ответ: {quotient_str}₍{self.base}₎" + (f" (остаток {remainder_str}₍{self.base}₎)" if remainder != 0 else "")
|
||||
)
|
||||
steps.append(step5)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user