Урок математики#572

Урок математики (Розбір)

У задачі потрібно розкласти число на прості множники, тобто подати його у вигляді n = p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot p_k^{a_k}, де p_1 < p_2 < ... < p_k — прості числа. Кожен простий дільник p_i виводиться разом зі своїм степенем a_i, якщо a_i > 1.

Будемо перебирати можливі дільники у порядку зростання, починаючи з . Якщо ділить , то ділимо на доти, доки ділення виконується націло, і підраховуємо кількість ділень . Отримане значення і є степенем, з яким входить до розкладу. Після цього виводимо , якщо c = 1, або i^c, якщо c > 1.

Перебір дільників достатньо вести до \sqrt{n}. Якщо у числа немає дільників у проміжку від до \sqrt{n}, то це число просте. Тому після завершення циклу поточне значення або дорівнює , або є простим числом — останнім множником розкладу, який також потрібно вивести. Такий "великий" множник може бути лише один: добуток двох множників, більших за \sqrt{n}, перевищує .

Приклад. Розглянемо n = 3240.

Залишок n = 5 > 1 є простим множником, виводимо .

Відповідь: 2^3*3^4*5.

Реалізація алгоритму

Функція factor виконує розклад числа на прості множники.

void factor(int n)
{
  for (int i = 2; i <= sqrt(n); i++)
  {
    if (n % i) continue;

Число є дільником . У змінній підрахуємо степінь, з яким воно входить до розкладу .

    int c = 0;
    while (n % i == 0) n /= i, c++;

Виводимо множник i^c. Якщо степінь множника c = 1, виводимо лише . В іншому випадку виводимо множник з його степенем.

    if (c > 1) printf("%d^%d",i,c); else printf("%d",i);

Якщо число ще не розкладено повністю (n > 1), виводимо знак множення.

    if (n > 1) printf("*");
  }

Якщо після завершення циклу значення більше за , то воно є простим.

  if (n > 1) printf("%d",n);
  printf("\n");
}

Основна частина програми. Читаємо вхідне число і запускаємо його факторизацію.

scanf("%d",&n);
factor(n);

Python реалізація

import math

Функція factor виконує розклад числа на прості множники.

def factor(n):
  for i in range(2, math.isqrt(n) + 1):
    if n % i: continue

Число є дільником . У змінній підрахуємо степінь, з яким воно входить до розкладу .

    c = 0
    while n % i == 0:
      n //= i
      c += 1

Виводимо множник i^c. Якщо степінь множника c = 1, виводимо лише . В іншому випадку виводимо множник з його степенем.

    if c > 1: print(i,"^",c, sep = "", end="")
    else: print(i, end="")

Якщо число ще не розкладено повністю (n > 1), виводимо знак множення.

    if n > 1: print("*", end="")

Якщо після завершення циклу значення більше за , то воно є простим.

  if n > 1: print(n)
  else: print()

Основна частина програми. Читаємо вхідне число і запускаємо його факторизацію.

n = int(input())
factor(n)