由 2、3、5 和 7 組成的數字中 n 的位置
問題陳述包括列印 n 在由 2、3、5 和 7 組成的數字中的位置,其中 n 將是使用者給出的任何正數。
由 2、3、5 和 7 組成的數字意味著這將是嚴格遞增數字的序列,這些數字僅包含數字 2、3、5 或 7,即前四個素數。該序列的前幾個數字,其中所有數字的數字都只有 2、3、5 和 7,分別是2、3、5、7、22、23、25、27、32、33、35、37,依此類推。
基本上,序列中的每個數字都是由這 4 個數字(即 2、3、5 或 7)的組合構成的,並且序列按升序排列。
在這個問題中,我們將給出一個數字 N,它只有 2、3、5 和 7 作為它的數字,我們需要找出給定數字在序列中的位置並打印出來,這將是所需的輸出。
讓我們透過以下示例更好地理解這個問題。
INPUT : N=33
OUTPUT : 10
說明 - 給定的數字,其數字只有 2、3、5 或 7,輸入為 33。在僅包含 2、3、5 或 7 作為其數字的此類數字的序列中,33 的位置是第 10 位。因此,我們的輸出為 10。
INPUT : 52
OUTPUT : 13
說明 - 輸入的數字是 52。當我們遵循每個數字都具有 2、3、5 或 7 作為其數字並且序列嚴格遞增的模式時,我們發現 52 在第 13 位。因此,我們所需的輸出為 13。
讓我們瞭解直接找出給定數字位置的演算法,而無需建立整個序列。
演算法
如果我們觀察數字序列,其數字只有 2、3、5 或 7,我們可以看到我們只能用特定數字形成 4 種數字組合。我們將使用此邏輯來找出任何給定數字 N 的位置。
前四個數字的位置如下
2:第 1 位
3:第 2 位
5:第 3 位
7:第 4 位
由於序列按升序排列,因此接下來的四個數字將是兩位數,第一位數字為 2,因為我們只能用特定數字形成 4 個數字。
我們可以透過將從左起第一位數字的位置乘以 4 並加上該特定數字的位置來找到任何具有任意位數的數字的位置。
例如,N=52
最初位置將為 0。
從左邊的數字開始,5 在序列中的位置將是position*4+position of 5,即 0*4+3=3。現在位置將為 3。
下一個數字是 2,因此數字的位置將是 3*4+1,因為當前位置是 3 乘以 4,並且加上當前數字的位置使位置為 13,這是數字 52 在序列中的位置。
為了解決問題,我們將簡單地將位置初始化為 0。然後繼續檢查每個數字,直到數字的最後一位數字,並相應地更新位置 -
對於數字 2,位置將是 position*4+1。
對於數字 3,位置將是 position*4+2。
對於數字 5,位置將是 position*4+3。
對於數字 7,位置將是 position*4+4。
我們透過將其乘以 4 來更新位置,因為對於每個可能的數字,我們只能建立 4 種組合。因此,每次將位置乘以 4 並加上當前數字的位置,我們就可以得到數字 N 的位置,其數字只有 2、3、5 或 7。
為了有效地解決問題,我們將在方法中使用此演算法。
方法
在我們的方法中實現演算法以列印僅由 2、3、5 或 7 組成的數字 N 的位置的步驟 -
我們將建立一個函式來獲取給定數字的位置,其數字僅為 2、3、5 或 7。
我們將以字串的形式獲取輸入數字 N。
因此,從 i=0 到 i<string.size,我們遍歷字串 ()。我們將在迴圈中使用各種條件語句來處理所有可能的情況。
對於第一種情況,如果第 i 位數字是 2,我們將把位置乘以 4 並乘以 1,因為 1 是 2 的位置。類似地,我們將根據演算法部分中討論的內容,使用數字位置公式直到第 i 位,根據第 i 位數字。
每次迭代,根據現在位於第 i 位的數字更新位置。
當我們完成遍歷整個字串後,返回儲存在位置中的值,這就是我們需要的輸出。
示例
該方法的 C++ 程式碼
#include <bits/stdc++.h>
using namespace std;
//to find the position of the number with only 2,3,5 or 7 as its digits
int position(string N){
int p=0; //to store the position of the number
//iterating in a for loop to calculate the position
for(int i=0;i<N.size();i++){
if(N[i]=='2'){
//if the digit is 2
p = p * 4 + 1;
//multiplying the position by 4 and adding the position of the digit
}
else if(N[i]=='3'){
// if the digit is 3
p = p * 4 + 2;
}
else if(N[i]=='5'){
//if the digit is 5
p = p * 4 + 3;
}
else{ // for the case when digit is 7
p = p * 4 + 4;
}
}
return p; //return the position of the number N
}
using namespace std;
int main() {
string N;
N = "2357";
//calling the function
cout<<"The position of "<<N<<" in the sequence is : "<<position(N)<<endl;
N = "3327";
cout<<"The position of "<<N<<" in the sequence is : "<<position(N)<<endl;
return 0;
}
輸出
The position of 2357 in the sequence is : 112 The position of 3327 in the sequence is : 168
時間複雜度 - O(n),其中 n 是字串的長度或數字中的數字個數,因為我們在 for 迴圈中迭代 n 次以計算給定數字在序列中的位置
空間複雜度 - O(1),因為我們沒有使用任何額外的空間來解決問題。
結論
本文討論了在僅包含 2、3、5 或 7 作為其數字的數字序列中查詢數字 N 位置的演算法,並且為了有效地在 C++ 中解決問題,我們在方法中實現了該演算法,而無需使用任何額外的空間,時間複雜度為 O(n)。
我希望在閱讀本文後,您瞭解了問題以及在 C++ 中解決該問題的方案。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP