📌  相关文章
📜  可以由仅由 0 和 7 组成的给定 N 位数字组成的可被 50 整除的最大数(1)

📅  最后修改于: 2023-12-03 14:50:38.146000             🧑  作者: Mango

可以由仅由 0 和 7 组成的给定 N 位数字组成的可被 50 整除的最大数

对于一个数能否被 50 整除,只需要判断其末两位是否能被 50 整除即可。因此,我们只需要在 N 位数字中,找到最大的末两位能被 50 整除的数字组合即可。

首先我们需要明确,末两位能被 50 整除,即这两个数是 00、50 或者 70。而一个 N 位数字由 0 和 7 组成,那么末两位必定是由 0 和 7 组成的。

接下来考虑如何构造最大的 N 位数字。

首先将所有位都填为 7,这样可以保证这个数尽可能大。

然后从最高位开始往低位遍历,如果遇到某一位填为 7 后,末两位不能被 50 整除,那么就将该位置变为 0,并将低位全部填为 7。

具体实现可以按如下伪代码:

num = "7" * N   # 将所有位都填为 7

for i in range(N-1, 1, -1):
    if num[-2:] in ["00", "50", "70"]:
        break   # 当最后两位可以被 50 整除时,跳出循环

    if num[i] == "7":
        num = num[:i] + "0" + "7"*(N-i-1)   # 将该位置变为 0,并将低位全部填为 7

if num[-2:] not in ["00", "50", "70"]:
    num = "-1"   # 没有符合要求的数字组合,返回 -1

这样,我们就可以找到最大的由 0 和 7 组成的 N 位数字,使其末两位能被 50 整除。

完整代码如下:

def find_max_num(N):
    num = "7" * N   # 将所有位都填为 7

    for i in range(N-1, 1, -1):
        if num[-2:] in ["00", "50", "70"]:
            break   # 当最后两位可以被 50 整除时,跳出循环

        if num[i] == "7":
            num = num[:i] + "0" + "7"*(N-i-1)   # 将该位置变为 0,并将低位全部填为 7

    if num[-2:] not in ["00", "50", "70"]:
        return "-1"   # 没有符合要求的数字组合,返回 -1

    return num

代码测试:

print(find_max_num(4))   # 输出 7770
print(find_max_num(5))   # 输出 77770
print(find_max_num(6))   # 输出 777770
print(find_max_num(7))   # 输出 7777770
print(find_max_num(8))   # 输出 77777770
print(find_max_num(9))   # 输出 777777770
print(find_max_num(10))  # 输出 7777777770
print(find_max_num(11))  # 输出 77777777770

以上代码均可以顺利运行,并输出符合要求的数字。