欧拉项目(python练习)problem 47

这个程序跑的有些久。。。向各位大神求教更好的算法。。。


# -*- 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值