📜  程序检查N是否是居中的七边形数字(1)

📅  最后修改于: 2023-12-03 15:11:27.329000             🧑  作者: Mango

检查N是否是居中的七边形数字

简介

你是否曾经遇到过需要检查一个数字是否是七边形数字的要求呢?在这里,我们将介绍如何编写一个程序来检查一个数字N是否是居中的七边形数字。

什么是七边形数字

七边形数字是一种数字序列,它是按照以下方式构建的:

  1. 首先,从中心开始,写下数字1
  2. 然后,向右下方移动一格,写下数字2
  3. 然后,向左下方移动一格,写下数字3
  4. 接下来,向左下方移动一格,并向左继续移动,写下数字4
  5. 向左下方移动一格,并向左继续移动,写下数字5
  6. 向左下方移动一格,并向左继续移动,写下数字6
  7. 最后,向左下方移动一格,并向左继续移动,写下数字7

这样就得到了一个七边形数字序列。

7  6  5  4  3
 8  1  2  3
    4  5  6
       7
检查N是否为居中的七边形数字

可以通过计算公式来判断一个数字是否为居中的数字。最中心的数字是1,最外层的数字为7,每层的数字数量为1、6、12、18、24、30、36,全部数字的总量为1+6+12+18+24+30+36=127。

因此,我们可以使用以下的算法来检查数字N是否为居中的数字:

  1. 如果N等于1,那么N是居中的数字,返回True
  2. 否则,计算数字序列中最大的数字max,如果max小于N,则N不是居中的数字,返回False
  3. 计算数字序列中最小的数字min,如果min大于N,则N不是居中的数字,返回False
  4. 如果N减去min加上1的结果可以被7整除,那么N是居中的数字,返回True;否则返回False。

我们可以将上述算法转换为以下的Python代码由程序来执行:

def is_centered_hexagonal_number(n:int)->bool:
    if n == 1:
        return True
    
    max_num = 1
    layer = 1
    while max_num < n:
        layer += 1
        max_num = 3 * layer * (layer - 1) + 1

    min_num = 3 * (layer - 1) * (layer - 2) + 2
    if n < min_num:
        return False
    
    return (n - min_num + 1) % 7 == 0
测试样例
assert is_centered_hexagonal_number(1) == True
assert is_centered_hexagonal_number(7) == True
assert is_centered_hexagonal_number(37) == True
assert is_centered_hexagonal_number(38) == False
assert is_centered_hexagonal_number(41) == False

在上述测试样例中,我们可以发现一些特化情况:

  1. 数字1是居中的数字;
  2. 数字7是居中的数字;
  3. 数字37是居中的数字;
  4. 数字38不是居中的数字;
  5. 数字41不是居中的数字。