檢查給定數字是否為多可整除數
問題陳述包括檢查給定整數 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 整除。我希望您覺得本文對解決您關於該概念的疑問有所幫助。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP