这个程序跑的有些久。。。向各位大神求教更好的算法。。。
# -*- coding:utf8 -*-
import sys
import decide_whether_prime
#题目设置
'''最小的两个具有两个不同质数因子的连续整数是:
14 = 2 × 7
15 = 3 × 5
最小的三个具有三个不同质数因子的连续整数是:
644 = 2² × 7 × 23
645 = 3 × 5 × 43
646 = 2 × 17 × 19.
找出最小的四个具有四个不同质数因子的整数。它们之中的第一个是多少?'''
#解题思路:从1000起开始逐个判断,计算出连续的四个数字,找到它们的因子列表,求出不同因子的个数,如果对于一组连续的四个数字,每个数字的因子列表的不同因子个数为4
# 且每个因子均为质数,那么满足条件,返回这组数字中的第一个数字即可
class DifferentFactorsConsecutiveNumbers(): #定义一个类,寻找连续的含有不同质因子的数字
def __init__(self):
pass
def create_factors_list(self , number): #定义了一个方法,创建一个给定数字的因子列表(相同因子不合并),参数为给定数字,返回因子列表
factors_list = []
factor = 2
while(number != 1):
if number % factor != 0:
factor = factor + 1
else :
factors_list.append(factor)
number = number / factor
return factors_list
def count_factors_number(self , number): #定义了一个方法,计算一个数字的不同因子的个数,参数为给定数字,返回不同因子个数
factors_list = self.create_factors_list(number)
factors_number = len(list(set(factors_list)))
return factors_number
def judge_whether_prime_factors(self , number): #定义了一个方法,判断一个数字的因子是否全部为质数,参数为给定数字,如果全部为质数,返回1
factors_list = self.create_factors_list(number)
all_is_prime_factor = 1
for factor in factors_list:
if decide_whether_prime.decide_whether_prime(factor) == 0:
all_is_prime_factors = 0
break
return all_is_prime_factor
def find_first_number(self): #主方法,寻找满足条件的四个连续数字中的第一个,返回第一个数字
first_number = 1000
while(True):
is_required_number = 0
second_number = first_number + 1
third_number = first_number + 2
forth_number = first_number + 3
if self.count_factors_number(first_number) == 4 and self.count_factors_number(second_number) == 4 and \
self.count_factors_number(third_number) == 4 and self.count_factors_number(forth_number) == 4:
if self.judge_whether_prime_factors(first_number) == 1 and self.judge_whether_prime_factors(second_number) == 1 and \
self.judge_whether_prime_factors(third_number) == 1 and self.judge_whether_prime_factors(forth_number) == 1 :
is_required_number = 1
if is_required_number == 1:
print self.create_factors_list(first_number),self.create_factors_list(second_number), \
self.create_factors_list(third_number),self.create_factors_list(forth_number)
return first_number
first_number = first_number + 1
if __name__ == "__main__":
different_factors_consecutive_numbers = DifferentFactorsConsecutiveNumbers()
print different_factors_consecutive_numbers.find_first_number()
decide_whether_prime代码已在46题列出。。。
运行结果: 134043