檢查給定數字是否為多可整除數


問題陳述包括檢查給定整數 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.