检查给定数字是否为多可整除数


问题陈述包括检查给定整数 N 是否为多可整除数。一个**多可整除数**,也称为神奇数字,是一个遵循唯一模式的数字。由给定数字的前 p 位数字组成的数字应始终能被 p 整除,并且给定数字中不应有前导零。如果一个数字满足这些属性,则它是一个多可整除数,否则不是。这里,p 应该在**(1,给定数字的总位数)**范围内。让我们用一个例子来理解多可整除数的概念

让我们假设一个数字为 5432。

因为它不以零开头,所以它满足第一个属性。现在让我们检查其他属性。由给定数字的前两位数字组成的数字是 54。它可以被 2 整除。类似地,由给定数字的前 3 位数字组成的数字是 543,它可以被 3 整除。此外,由该数字的前 4 位数字组成的数字可以被 4 整除。因此,它是一个多可整除数。现在让我们检查数字 82325。该数字不以 0 开头。并且该数字的前两位数字构成 82,它可以被 2 整除。但是该数字的前 3 位数字构成 823,它不能被 3 整除。

尽管该数字的前 4 位数字 8232 可以被 4 整除,并且该数字的前 5 位数字也可以被 5 整除。但是,它不是多可整除数,因为它不遵循多可整除数的标准,因为该数字的前 3 位数字不能被 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 以避免小数。

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

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

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

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

示例

以上方法的 C++ 实现:

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

//function to check the conditions of the polydivisible number
bool polydivisible(int N){
   int d[(int)log(N)+1]={0}; //to store every single digits of the number
   int x=0; //for storing the index value of array
   while(N>0){
      int a = N%10; //using modulo we can get the last digit of the number
      d[x]=a; //storing each digit of the number in the array
      N = N/10; //updating the number by remaining number
      x++; //increase the index by 1
   }
   int s=sizeof(d)/sizeof(d[0]);
   reverse(d,d+x); //reversing the array to make right order of digits
   N=d[0];
   for(int i=1;i<x;i++){ //checking the conditions for polydivisible number
      N = N * 10 + d[i]; //number formed by i digits
      if(N%(i+1)!=0){ //checking if it is divisible by the number of digits
         return false; //if not divisible store false in a and break the loop
      }
   }
   return true;
}
int main(){
   int N=522589;
   if(polydivisible(N)){ //if the function returns true
      cout<<"The number is a polydivisible number"<<endl;
   } else { //if the function returns false
      cout<<"The number is not a polydivisible number"<<endl;
   }
   N=9216543;
   if(polydivisible(N)){
      cout<<"The number is a polydivisible number"<<endl;
   } else {
      cout<<"The number is not a polydivisible number"<<endl;
   }
   return 0;
}

输出

The number is not a polydivisible number
The number is a polydivisible number

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

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

结论

在本文中,我们讨论了如何使用一个数组来检查给定数字 N 是否为多可整除数,我们将给定数字的每个数字都存储在数组中,然后检查由数字的 p 位组成的每个数字是否可以被 p 整除。我希望您觉得本文对解决您关于该概念的疑问有所帮助。

更新于:2023年3月16日

288 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.