Riyaziyyat dərsi#572

Riyaziyyat dərsi (Həll təhlili)

Məsələdə ədədini sadə vuruqlara ayırmaq tələb olunur, yəni onu n = p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot p_k^{a_k} şəklində təqdim etmək lazımdır, burada p_1 < p_2 < ... < p_k — sadə ədədlərdir. Hər bir sadə bölən p_i öz dərəcəsi a_i ilə birlikdə çıxarılır, əgər a_i > 1 olarsa.

Mümkün bölənləri artan sırada, -dən başlayaraq nəzərdən keçirəcəyik. Əgər -i bölürsə, onda -i -yə bölmə tam alınana qədər bölürük və bölmələrin sayını -də hesablayırıq. Alınan qiyməti məhz o dərəcədir ki, bu dərəcə ilə ayrılışa daxil olur. Bundan sonra -ni çıxarırıq, əgər c = 1 olarsa, və ya i^c-ni çıxarırıq, əgər c > 1 olarsa.

Bölənlərin yoxlanılmasını \sqrt{n}-ə qədər aparmaq kifayətdir. Əgər ədədin -dən \sqrt{n}-ə qədər olan aralıqda bölənləri yoxdursa, onda bu ədəd sadədir. Buna görə də dövr başa çatdıqdan sonra cari qiyməti ya -ə bərabərdir, ya da sadə ədəddir — ayrılışın son vuruğudur, onu da çıxarmaq lazımdır. Belə "böyük" vuruq yalnız bir dənə ola bilər: \sqrt{n}-dən böyük olan iki vuruğun hasili -dən çox olar.

Misal. n = 3240 ədədinə baxaq.

Qalıq n = 5 > 1 sadə vuruqdur, çıxarırıq.

Cavab: 2^3*3^4*5.

Alqoritmin realizasiyası

factor funksiyası ədədinin sadə vuruqlara ayrılışını həyata keçirir.

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

ədədi -in bölənidir. dəyişənində onun -in ayrılışına daxil olduğu dərəcəni hesablayırıq.

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

i^c vuruğunu çıxarırıq. Əgər vuruğun dərəcəsi c = 1 olarsa, yalnız -ni çıxarırıq. Əks halda, vuruğunu onun dərəcəsi ilə birlikdə çıxarırıq.

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

Əgər ədədi hələ tam ayrılmayıbsa (n > 1), vurma işarəsini çıxarırıq.

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

Əgər dövr başa çatdıqdan sonra qiyməti -dən böyükdürsə, onda o sadədir.

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

Proqramın əsas hissəsi. Giriş ədədi -i oxuyuruq və onun faktorizasiyasını işə salırıq.

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

Python realizasiyası

import math

factor funksiyası ədədinin sadə vuruqlara ayrılışını həyata keçirir.

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

ədədi -in bölənidir. dəyişənində onun -in ayrılışına daxil olduğu dərəcəni hesablayırıq.

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

i^c vuruğunu çıxarırıq. Əgər vuruğun dərəcəsi c = 1 olarsa, yalnız -ni çıxarırıq. Əks halda, vuruğunu onun dərəcəsi ilə birlikdə çıxarırıq.

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

Əgər ədədi hələ tam ayrılmayıbsa (n > 1), vurma işarəsini çıxarırıq.

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

Əgər dövr başa çatdıqdan sonra qiyməti -dən böyükdürsə, onda o sadədir.

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

Proqramın əsas hissəsi. Giriş ədədi -i oxuyuruq və onun faktorizasiyasını işə salırıq.

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