鱼C论坛

 找回密码
 立即注册
查看: 1381|回复: 11

[已解决]求一个数的质数因子,不报错,就是没有结果

[复制链接]
发表于 2020-6-23 16:10:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

  1. #将一个正整数分解质因数。例如:输入13195,打印13195 = 5*7*13*29
  2.                              # 输入90,打印出90=2*3*3*5
  3. #思路:首先用number对从2开始的质数取余,如果余数为0,表示能被该质数整除,然后再用该数除以该素数,取其除数
  4. #将除数赋值给number,又再次对此数从质数3开始取余,判断是否能被整除,反复重复上述的步骤,直到所存储的因子乘机 == 输入值
  5. #此时的质数为输入的初始number的最大质数因子
  6. import math
  7. num = int(input("enter the number:"))
  8. factor = []
  9. my_num = 1  #存放所求得质数因子乘积值
  10. number = num

  11. i = 2
  12. while my_num != number:
  13.        #判断i是不是质数
  14.        for j in range(2,int(math.sqrt(i))+1):
  15.            if (i % j) == 0:
  16.                break    #不是质数,结束循环
  17.            elif j == int(math.sqrt(i)):   #判断是否执行到了最后
  18.                 #在i是质数的前提下
  19.                 if number % i == 0 :
  20.                     shang = number // i     #取商                                                                                 
  21.                     factor.append(i)                                                                                             
  22.                     my_num = my_num * i
  23.                     if  my_num == number:                                                                                             
  24.                           print(factor)
  25.                     else:
  26.                         number = shang  
  27.         
  28.        i = i + 1                          
  29.                      
  30.   
复制代码
最佳答案
2020-6-23 16:25:48
这个能行,其实看别人程序蛮累的:
  1. num = int(input("enter the number:"))
  2. def prime_f(num):
  3.     f = 2
  4.     factor = []
  5.     while f<int(math.sqrt(num)):
  6.         while num % f == 0:
  7.             factor.append(f)
  8.             num //= f
  9.         f += 1
  10.     factor.append(num)
  11.     return factor
  12. print(prime_f(num))
复制代码

结果:
  1. enter the number:33552
  2. [2, 2, 2, 2, 3, 3, 233]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-23 16:24:15 | 显示全部楼层
你再好好拢一拢,死循环 是一定的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-23 16:25:36 | 显示全部楼层

之前做过一次只是没用开方效率低

  1. def prime_factorization(n):
  2.     prime_list = []
  3.     temp = n
  4.     i = 2
  5.     for i in range(2,n):
  6.         while not(n%i):
  7.             if not (n % i):
  8.                 n //= i
  9.                 prime_list.append(i)
  10.     if i == 2 or (prime_list == [] and i+1 == temp):
  11.         prime_list.append(temp)
  12.     return prime_list

  13. print(prime_factorization(13195))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-23 16:25:48 | 显示全部楼层    本楼为最佳答案   
这个能行,其实看别人程序蛮累的:
  1. num = int(input("enter the number:"))
  2. def prime_f(num):
  3.     f = 2
  4.     factor = []
  5.     while f<int(math.sqrt(num)):
  6.         while num % f == 0:
  7.             factor.append(f)
  8.             num //= f
  9.         f += 1
  10.     factor.append(num)
  11.     return factor
  12. print(prime_f(num))
复制代码

结果:
  1. enter the number:33552
  2. [2, 2, 2, 2, 3, 3, 233]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-23 16:44:38 | 显示全部楼层
java2python 发表于 2020-6-23 16:25
这个能行,其实看别人程序蛮累的:

结果:

难道是我一开始就理解错了题意吗,在进行判断余数是不是为0之前,不需要判断F是不是质数吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-23 16:46:59 | 显示全部楼层
wp231957 发表于 2020-6-23 16:24
你再好好拢一拢,死循环 是一定的了

求指导,为啥是死循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-23 16:51:50 | 显示全部楼层
猪猪虾 发表于 2020-6-23 16:44
难道是我一开始就理解错了题意吗,在进行判断余数是不是为0之前,不需要判断F是不是质数吗

理解你想要效率高的想法,不过把质数筛选出来,本身也是很花功夫的,一般不会这么做。
就是对于N:检查2-根号N之间的因数,当发现因数后,Num除以因数,num变小了,他就不需要检查到一开始的根号(num)的地方了,所以这个循环不能用for,需要用while,for循环的首尾是写死的,即便里面num值改变了,也就是根号(num)改变了,他照样执行到原先的根号(num)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-23 17:00:57 | 显示全部楼层
java2python 发表于 2020-6-23 16:51
理解你想要效率高的想法,不过把质数筛选出来,本身也是很花功夫的,一般不会这么做。
就是对于N:检查2- ...

1.你的程序是怎么保证所求得的因数都是质数的,

2.factor.append(num),为啥可以直接将此时的Num添加到列表里面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-23 17:05:20 | 显示全部楼层
猪猪虾 发表于 2020-6-23 17:00
1.你的程序是怎么保证所求得的因数都是质数的,

2.factor.append(num),为啥可以直接将此时的Num添加 ...

从2开始一路往上,所有合数,也是有质数相乘得到,而程序里面有
  1.         while num % f == 0:
  2.             factor.append(f)
  3.             num //= f
复制代码

比如3是质数,也是num的因子,可能有好几个3的因子,但发现3是因子就一直循环,说简单点就是榨干了,里面再也没有3的因子,遇到9就跳过了。
最后除不尽的,留下的就是num,当然可能是1,比如输入16,遇到2,除4次,剩下1,这里可以判断一下,不是1就加入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-23 17:09:08 | 显示全部楼层
java2python 发表于 2020-6-23 17:05
从2开始一路往上,所有合数,也是有质数相乘得到,而程序里面有

比如3是质数,也是num的因子,可能有 ...


原谅我脑子不好,第2个问题我懂了,第一个还是没懂,您换个说法。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-23 17:12:43 | 显示全部楼层
本帖最后由 java2python 于 2020-6-23 17:13 编辑
猪猪虾 发表于 2020-6-23 17:09
原谅我脑子不好,第2个问题我懂了,第一个还是没懂,您换个说法。。


比如52,按道理2是因子,4也是
通过:
  1. while num % f == 0:
  2.             factor.append(f)
  3.             num //= f
复制代码

num=52,f=2
循环一次
num=26,f=2
循环一次
num=13,f=2
当f=4的时候,这个时候num=13了,因为2的因子已经被除掉了(num都不存在2的因子,哪来的4的因子呢)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-23 17:20:22 | 显示全部楼层
java2python 发表于 2020-6-23 17:12
比如52,按道理2是因子,4也是
通过:

懂了,学到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 06:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表