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.
i = 2: 3240 \to 1620 \to 810 \to 405, c = 3. 2^3* çıxarırıq, çünki n = 405 > 1.
i = 3: 405 \to 135 \to 45 \to 15 \to 5, c = 4. 3^4* çıxarırıq, çünki n = 5 > 1.
i = 4: 4 \cdot 4 > 5, dövr başa çatır.
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 mathfactor 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 += 1i^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)