n =int(input())
n_ = n # 元々のnを記憶しておく
div_list =[]# 素因数のリストを作る
num =2# 2から割り始めるwhile num <=int(n_**0.5)+1:# 割る数がint(n_**0.5)+1以下の間 繰り返すif n%num ==0:
div_list.append(num)# 割り切れたら素因数のリストに追加
n = n/num # nを更新するelse:
num +=1# 割り切れなければ次の数を試すif n < num:break# 割る数のほうがnより大きくなったら終了# n が1でなければそれも素因数なので追加if n !=1:
div_list.append(int(n))print(div_list)
Python
2から順番に割っていき割り切れた場合は素因数のリストに追加しています.
最後の if n != 1 については,理解できない場合はここを消して10で試してみてください.
(というか私は10で間違いに気づいてこの文を追加しました)
1回の素因数分解の最大計算量はO(√n)ですね.
13桁くらいなら数ならすぐ終わります.
調子に乗って1からnまでのすべての数を素因数分解してみましょう.
for i inrange(2,len(div_list)):print(i,end="=")for j inrange(len(div_list[i])):if j ==len(div_list[i])-1:print(div_list[i][j])else:print(div_list[i][j],end="*")
n =int(input())
num_list =[Truefor i inrange(n+1)]
num_list[0]=False
num_list[1]=False# エラトステネスの篩for i inrange(2,int(n**0.5)+1):if num_list[i]==True:
p = i
for j inrange(p*p,n+1,p):
num_list[j]=False
prime_list =[]for i inrange(n+1):if num_list[i]:
prime_list.append(i)# ここから素因数分解
div_list =[[]for i inrange(n+1)]# 素因数のリストを作るfor num inrange(n+1):
ind =0
n_ = num # 元々のnを記憶しておく
div_num =2# 2から割り始めるwhile div_num <=int(n_**0.5)+1:# 割る数がint(n_**0.5)+1以下の間 繰り返す
div_num = prime_list[ind]# 2から割り始めるif num%div_num ==0:
div_list[n_].append(div_num)# 割り切れたら素因数のリストに追加
num = num/div_num # nを更新するelse:
ind +=1# 割り切れなければ次の数を試すif num < div_num:break# 割る数のほうがnより大きくなったら終了# n が1でなければそれも素因数なので追加if num !=1:
div_list[n_].append(int(num))
n =int(input())
min_factor =[Falsefor i inrange(n+1)]
min_factor[0]=True
min_factor[1]=True# 最小の素因数を求めるfor i inrange(2,int(n**0.5)+1):if min_factor[i]==False:
p = i
min_factor[i]= p
for j inrange(p*p,n+1,p):if min_factor[j]==False:
min_factor[j]= p
for i inrange(n+1):if min_factor[i]==False:
min_factor[i]= i
# 最小の素因数を使って素因数分解を行う
div_list =[[]for i inrange(n+1)]for num inrange(2,n+1):
num_ = num
while num >1:
div_list[num_].append(min_factor[num])
num =int(num/min_factor[num])