检查给定数字是否可整除
问题陈述包括检查给定数字对于任何给定整数 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 整除。我希望您发现本文有助于解决您对该概念的疑问。