Одиночный алгоритм

using Printf  # Используется для форматированного вывода (например, @printf)

# Функция разбивает число N как строку на m частей 
function split_number_str(N::String, m::Integer)
len = length(N) # Длина строки N
base_len = div(len, m) # Базовая длина каждой части при делении на m
remainder = len % m # Остаток от деления длины N на m

parts = String[] # Массив для хранения частей
idx = 1 # Текущий индекс начала следующей части

for i in 1:m  # Цикл по количеству частей
current_len = base_len + (i <= remainder ? 1 : 0)  # Добавляем +1 к длине первым "remainder" частям
push!(parts, N[idx:idx+current_len-1]) # Добавляем подстроку в массив частей
idx += current_len # Сдвигаем индекс на начало следующей части
end

return parts # Возвращаем массив строковых частей
end

# Умножает часть числа, сохраняя длину
function multiply_preserve_length(part::String, k::Integer)
num = parse(BigInt, part) * k  # Преобразуем строку в BigInt и умножаем на k
result = string(num)  # Обратно преобразуем в строку

return lpad(result, max(length(part), length(result)), '0') # Если результат короче исходной части — дополняем нулями слева

end

# Проверка СЧС для одного числа
function check_full_match_for_one_number(N::BigInt, m::Integer, k::Integer)
N_str = string(N)                         # Преобразуем N в строку
parts = split_number_str(N_str, m)        # Разбиваем N на m частей

pq_parts = [multiply_preserve_length(part, k) for part in parts] # Умножаем каждую часть и сохраняем как строки с сохранением длины

pq_str = join(pq_parts) # Объединяем умноженные части — это PQ

nk_str = string(N * k) # Умножаем всё число целиком — это NK

is_full_match = pq_str == nk_str # Удаляем ведущие нули из pq_str и nk_str для корректного сравнения (если нужно)

@printf("🔢 N = %s\n", N_str) # Выводим N
@printf("📐 m = %d\n", m) # Выводим количество частей
@printf("🧮 k = %d\n", k) # Выводим коэффициент умножения

if is_full_match # Если совпадают:
@printf("🛠 Разбиение:\n")
for (i, part) in enumerate(parts) # Перечисляем все части
@printf("   Часть %d: \"%s\"\n", i, part)
end
@printf("➡️ Умноженные части:\n")
for (i, part) in enumerate(pq_parts)  # Перечисляем умноженные части
@printf("   Часть %d: \"%s\"\n", i, part)
end
@printf("📌 PQ = %s\n", pq_str)
@printf("📌 NK = %s\n", nk_str)
@printf("✅ Результат: Полное совпадение найдено!\n")

filename = "full_match_N$(N_str[1:min(50, length(N_str))]...)_m$m.txt"  # Генерируем имя файла

open(filename, "w") do io # Открываем файл на запись
write(io, "📊 Сруктуральная числовая симметрия\n")
write(io, "=========================================\n")
write(io, "🔢 N = $N_str\n")
write(io, "📐 m = $m\n")
write(io, "🧮 k = $k\n")
write(io, "-----------------------------------------\n")
write(io, "🛠 Разбиение:\n")
for (i, part) in enumerate(parts)
write(io, "   Часть $i: \"$part\", длина: $(length(part))\n")
end
write(io, "➡️ Умноженные части:\n")
for (i, part) in enumerate(pq_parts)
write(io, "   Часть $i: \"$part\", длина: $(length(part))\n")
end
write(io, "📌 PQ = $pq_str\n")
write(io, "📌 NK = $nk_str\n")
write(io, "✅ Результат: Полное совпадение найдено.\n")
write(io, "=========================================\n")
end

println("\n📄 Результаты сохранены в файл: $filename")
else # Если нет совпадения:
@printf("❌ Нет совпадений для данного разбиения.\n")
end

return ( # Возвращаем структуру с результатом
N = N,
m = m,
k = k,
PQ = pq_str,
NK = nk_str,
result = is_full_match ? "Полное совпадение" : "Нет совпадения"
    )
end

# Пользовательский раздел
println("🔄 Вычисляем N = 99^99999...") # Пример: N = 99^99999 большое число
N_bigint = big(99)^99999 # Можно заменить на big"99"^big"99999" для большего числа
m = 2 # количество частей
k = 3 # k — натуральное число

# Запуск проверки
check_full_match_for_one_number(N_bigint, m, k)



Источник: https://github.com/Misha0966/New-project/blob/main/%D0%9E%D0%B4%D0%B8%D0%BD%D0%BE%D1%87%D0%BD%D1%8B%D0%B9%20%D0%B0%D0%BB
Категория: Тренды и Новинки | Добавил: misha096633 (14.06.2025) | Автор: Ющенко Михаил Юрьевич E W
Просмотров: 5 | Теги: СЧС паттерн, счс, Проверка СЧС для одного числа | Рейтинг: 5.0/1
Всего комментариев: 0