【问题描述】 由数学基本定理可知:任何一个大于1的非素数整数(即合数)都可以唯一分解成若干个素数的乘积。编写程序,从控制台读入一个合数(合数的大小不会超过int数据类型表示的范围),求这个合数可以分解成的只出现一次的素数。例如合数1260分解成素数乘积为:2*2*3*3*5*7,2和3出现两次,5和7出现一次,所以求得的结果为5和7。 【输入形式】 从控制台输入一个合数。 【输出形式】 在标准输出上按照由小到大的顺序输出分解后的只出现一次的素数,各素数之间以一个空格分隔,最后一个素数后也可以有一个空格。若没有只出现一次的素数,则什么都不输出。 【输入样例】 6154380 【输出样例】 5 29 131 【样例说明】 输入的合数为6154380,其分解成的素数乘积为:2*2*3*3*3*3*5*29*131,其中2出现两次,3出现4次,5、29和131只出现一次,所以只输出5、29、131。 【评分标准】 共有5个测试点。
def IsPrime(n):
k=0
for i in range(2,int(n/2)+1):
if n % i == 0:
k = 1
if k == 1:
return 0
else:
return 1
numb=int(input()) #第一题
divisor=[]
for l in range(int(numb/2),1,-1):
if numb % l == 0 and IsPrime(l):
divisor.append(l)#可以分解成的所有质数
#########print(divisor)#test
decomposition=[]
i=0
while numb not in divisor:
numb=numb/divisor[i]
decomposition.append(divisor[i])
i=i+1
if i==len(divisor):
i=0
decomposition.append(int(numb))
####print(decomposition)#test
decomposition.sort()
divi=[]
[divi.append(x) for x in decomposition if decomposition.count(x)==1 ]
print(" ".join(str(i) for i in divi))
最终种结果显示,有一个点运行时间过长.(仅个人学习记录用)
有一种简便的方法:直接除质数(从小到大)。
文章讲述了如何编写程序,接收用户输入的合数,然后分解成只出现一次的素数。通过IsPrime函数判断是否为素数,找出所有质数因子,并筛选出只出现一次的素数输出。部分代码示例展示了这个过程,但提及有运行时间过长的问题和简便方法的提示。

被折叠的 条评论
为什么被折叠?



