LeetCode3345 最小可整除数位乘积I

发布于:2025-02-26 ⋅ 阅读:(15) ⋅ 点赞:(0)

算法解析:寻找大于等于 n 且各数位之积能被 t 整除的最小整数

引言

在算法的探索中,我们常常会遇到一些看似简单却颇具挑战的问题。本次要探讨的问题是:给定两个整数 n 和 t,找出大于等于 n 的最小整数,使得该整数各个数位上的数字之积能被 t 整除。这不仅需要我们对数字的操作有深入理解,还考验着编程逻辑和代码实现能力。

问题描述

给定两个整数 n 和 t,我们要在大于等于 n 的整数范围内,找出最小的整数 x,满足 x 各数位上数字相乘的结果能被 t 整除。例如,当 n = 10t = 2 时,我们需要从 10 开始逐个检查,找到第一个符合条件的数。

代码实现

完整代码

#include <iostream>

// 计算一个整数各数位之积的函数
int digitProduct(int num) {
    int product = 1;
    // 当 num 大于 0 时,继续循环
    while (num > 0) {
        // 取出 num 的最后一位数字
        int digit = num % 10;
        // 计算各数位之积
        product *= digit;
        // 去掉 num 的最后一位数字
        num /= 10;
    }
    return product;
}

// 寻找大于等于 n 且各数位之积能被 t 整除的最小整数的函数
int smallestNumber(int n, int t) {
    // 从 n 开始逐个检查整数
    for (int i = n; ; i++) {
        // 计算当前整数 i 的各数位之积
        int product = digitProduct(i);
        // 检查各数位之积是否能被 t 整除
        if (product % t == 0) {
            return i;
        }
    }
}

int main() {
    int n = 10;
    int t = 2;
    // 调用 smallestNumber 函数并输出结果
    std::cout << smallestNumber(n, t) << std::endl;
    return 0;
}

代码解释

digitProduct 函数
  • 功能:计算一个整数各个数位上数字的乘积。
  • 实现步骤
    • 初始化变量 product 为 1,用于存储数位之积。
    • 使用 while 循环,只要 num 大于 0,就执行以下操作:
      • 通过 num % 10 获取 num 的最后一位数字,存储在 digit 中。
      • 将 digit 乘到 product 上。
      • 通过 num /= 10 去掉 num 的最后一位数字。
    • 循环结束后,返回 product
smallestNumber 函数
  • 功能:从 n 开始逐个检查整数,找到满足各数位之积能被 t 整除的最小整数。
  • 实现步骤
    • 使用无限循环 for (int i = n; ; i++) 从 n 开始依次检查每个整数。
    • 对于每个整数 i,调用 digitProduct 函数计算其各数位之积。
    • 检查该积是否能被 t 整除,如果可以,则返回该整数 i
main 函数
  • 功能:程序的入口,设置测试数据并调用 smallestNumber 函数输出结果。
  • 实现步骤
    • 设定 n = 10t = 2 作为测试数据。
    • 调用 smallestNumber 函数并将结果输出。

复杂度分析

时间复杂度

在最坏的情况下,我们可能需要检查大量的整数,直到找到满足条件的数。假设最终找到的满足条件的整数与 n 的差值为 m,那么时间复杂度为O(m)。也就是说,平均而言,我们需要遍历大约 m 个整数才能找到目标值。

空间复杂度

整个计算过程中,只使用了常数级的额外空间,如 productdigit 等变量,它们的数量不会随着输入规模的变化而变化。因此,空间复杂度为O(1)

测试用例分析

测试用例 1

  • 输入n = 10t = 2
  • 分析:10 的各数位之积为 1 * 0 = 0,因为 0 能被 2 整除,所以结果为 10。

测试用例 2

  • 输入n = 25t = 3
  • 分析:25 的各数位之积为 2 * 5 = 10,10 不能被 3 整除;接着看 26,其各数位之积为 2 * 6 = 12,12 能被 3 整除,所以结果为 26。

总结

通过上述代码和分析,我们成功解决了寻找大于等于 n 且各数位之积能被 t 整除的最小整数的问题。此问题让我们深入理解了如何对整数的各个数位进行操作,以及如何运用循环和条件判断来解决实际问题。在实际编程中,我们可以根据具体情况对代码进行优化,以提高效率。希望本文能帮助你更好地理解和解决类似的算法问题。如果你有任何疑问或其他想法,欢迎在评论区留言讨论。