检查给定数字是否可整除

data structurec++server side programming

问题陈述包括检查给定数字对于任何给定整数 N 是否可整除。可整除数,也称为魔法数字,是遵循独特模式的数字。给定数字的前 p 位数字所组成的数字应始终能被 p 整除,并且给定数字中不应有任何前导零。如果数字满足这些属性,则它为可整除数,否则不是。这里,p 应在(1,给定数字的总位数)范围内。让我们通过一个例子来理解可整除数的概念:

假设一个数字为 5432。

由于它不是以零开头,因此它满足第一个属性。现在让我们检查其他属性。给定数字的前两位数字形成的数是 54。它可以被 2 整除。同样,给定数字的前三位数字形成的数是 543,可以被 3 整除。此外,该数字的前四位数字形成的数可以被 4 整除。因此,它是一个可整除数。现在让我们检查数字 82325。该数字不是以 0 开头的。该数字的前两位数字为 82,可以被 2 整除。但是该数字的前三位数字为 823,不能被 3 整除。

但是,该数字的前四位数字可以被 4 整除,即 8232,而该数字的前五位数字也可以被 5 整除。然而,它不是一个可整除数,因为它不符合可整除数的标准,因为该数字的前三位数字不能被 3 整除。给定数字的前 p 位数字形成的数字应始终可以被 p 整除,直到 p 等于给定数字从 2 开始的位数。我们在问题中的任务包括我们将获得任何整数 N,我们需要检查它是否是否是可整除数并相应打印。

例如,

输入:N=861

输出:数字 861 是可整除数。

解释:由于数字的每个 p 位都可以被 p 整除,其中 p>1 且 p<=数字中的位数。

输入:N=42587

输出:数字 42587 不是可整除数。

解释:由于 p=3 不符合可整除数的标准。该数字的前 3 位数字组成的数字是 425,不能被 3 整除。

下面是我们将用来解决给定问题的算法。

算法

解决这个问题的逻辑很简单。算法的分步说明 -

  • 我们将取出给定数字 N 的所有数字并存储它们。

  • 我们将使用数组来存储所有数字。我们将使用模函数提取数字,并在每一步将数字除以 10。

  • 由于数组中存储的数字将按相反顺序排列,因此我们将使用 reverse() 库反转数组。

  • 现在我们将使用 for 循环检查数字是否为可整除数。

  • 在 for 循环中进行迭代,检查每个 p 数字是否可以被 p 整除。如果它满足 p 的每个值,直到 p 等于给定数字的总位数,则它是一个可整除数。

方法

  • 初始化一个函数来检查一个数字是否可整除。

  • 初始化一个数组并将给定数字 N 的所有数字存储在数组中。数组的大小应为 $\mathrm{\log_{10}{N}\:+\:1}$,因为它始终等于 N 中的数字位数。同时将 $\mathrm{\log_{10}{N}}$ 的值转换为 int,以避免出现小数。

  • 反转数组以获取正确顺序的数字。

  • 在 for 循环中从 int i=1 迭代到 i<数组的大小,并检查 i 位数字形成的数字是否可以被 i+1 整除,因为数组中的索引为零。

  • 如果 i 位数字形成的数字不能被 i+1 整除,则返回 false。否则,我们将在所有迭代之后返回 true,因为它满足所有情况的条件。

  • 如果函数 polydivisible 返回 true,则打印该数字是可整除数,如果 polydivisible 返回 false,则打印该数字不是可整除数。

示例

上述方法的 C++ 实现 −

#include <bits/stdc++.h>
using namespace std;

//函数检查可整除数的条件
bool polydivisible(int N){
    int d[(int)log(N)+1]={0}; //存储数字的每一位数字
    int x=0; //存储数组的索引值
    while(N>0){
        int a = N%10; //使用模数我们可以得到数字的最后一位数字
        d[x]=a; //将数字的每一位数字存储在数组中
        N = N/10; //用剩余数字更新数字
        x++; //将索引增加 1
    }
    int s=sizeof(d)/sizeof(d[0]);
    reverse(d,d+x); //反转数组以使数字顺序正确
    N=d[0];
    for(int i=1;i<x;i++){ //检查多余数的条件
        N = N * 10 + d[i]; //由 i 位数字组成的数字
        if(N%(i+1)!=0){ //检查它是否能被数字的位数整除
            return false; //如果不能整除,则将 false 存储在 a 中并中断循环
        }
    }
    return true;
}
int main(){
    int N=522589;
    if(polydivisible(N)){ //如果函数返回 true
        cout<<"该数字是可整除数"<<endl;
    } else { //如果函数返回 false
        cout<<"该数字不是可整除数"<<endl;
    }
    N=9216543;
    if(polydivisible(N)){
        cout<<"该数字是可整除数"<<endl;
    } else {
        cout<<"该数字不是可整除数"<<endl;
    }
    return 0;
}

输出

该数字不是可整除数
该数字是可整除数

时间复杂度:O($\mathrm{\log_{10}{N}}$)

空间复杂度:O($\mathrm{\log_{10}{N}}$)

结论

我们在本文中讨论了使用数组检查给定数字 N 是否可整除,其中我们将给定数字的每个数字存储在数组中,然后检查由该数字的 p 位数字形成的每个数字是否可被 p 整除。我希望您发现本文有助于解决您对该概念的疑问。


相关文章