欧拉项目(python练习)problem 44

编程新手,算法很烂,正在学习当中,欢迎大家批评指正,共同进步。。。

# -*- coding:utf8 -*-

import sys
from math import sqrt

#题目设置
'''五角数通过如下公式定义:Pn=n(3n-1)/2。前十个五角数是:

1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...

可以看出P4 + P7 = 22 + 70 = 92 = P8. 但是它们的差70 - 22 = 48却不是五角数。

找出五角数对Pj 和 Pk, 使得它们的和与差都是五角数,并且D = |Pk - Pj| 取到最小。这时D的值是多少?'''

#解题思路:首先创建一定长度的五角数列表,然后对列表中的两个数进行遍历,找到符合条件的几对五角数,进而求出最小差值


class MinimumDifferenceNumber():                                #定义一个类,寻找最小的差值
    def __init__(self):
        pass
    
    def create_number_list(self , length_of_list):              #创建五角数列表,length_of_list为定义的列表长度
        number_list = []
        for order_number in range(1 , length_of_list + 1):
            number  = order_number * (3 * order_number - 1) / 2
            number_list.append(number)
        return number_list
        
    def judge_whther_pentagonal(self , number):                 #创建判断五角数的方法,是五角数则返回TRUE
        if ((sqrt(24 * number + 1) + 1) / 6) % 1 == 0:       
            return True
        
    def compute_minimum_difference(self , length_of_list):      #计算符合条件的最小差值
        number_list = self.create_number_list(length_of_list)
        minimum_difference = 10000000
        for one_number in number_list:
            for another_number in number_list[number_list.index(one_number):]:
                if self.judge_whther_pentagonal(one_number + another_number) and self.judge_whther_pentagonal(abs(one_number - another_number)) :
                    difference = abs(one_number - another_number)
                    if difference < minimum_difference:
                        minimum_difference = difference
        return minimum_difference
   
if __name__ == "__main__":
    minimum_difference_number = MinimumDifferenceNumber()
    print minimum_difference_number.compute_minimum_difference(3000)

运行结果: 5482660

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值