問題陳述包括列印 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</p><p>OUTPUT : 10
解釋 - 輸入中僅包含 2、3、5 或 7 的給定數字為 33。在只有數字為2、3、5或7的數字序列中,33的位置是第10位。因此,我們的輸出是 10。
INPUT : 52</p><p>OUTPUT : 13
解釋 - 輸入中的數字是 52。當我們遵循序列中的模式時,每個數字都有 2、3、5 或 7 作為其數字,並且序列嚴格按遞增順序排列,我們在第 13 位找到 52。因此我們所需的輸出為 13。
讓我們了解直接找出給定數字的位置而不創建整個序列的演算法。
如果我們觀察數字只有 2、3、5 或 7 的數字序列,我們會發現我們只能形成 4 種具有特定數字的數字組合。我們將使用這個邏輯來計算出任意給定數字 N 的位置。
前四個數字的位置如下:
2:第一名
3:第二名
5:第三名
7:第四名
由於序列是按升序排列的,因此接下來的四個數字將是第一個數字為 2 的 2 位數字,因為我們只能用特定的數字組成 4 個數字。
我們可以透過將左邊第一個數字的位置乘以 4 並加上該特定數字的位置來找到任意位數的數字的位置。
例如,N=52
初始位置將為 0。
從左邊的數字開始,序列中5的位置將是位置*4 5的位置,即0*4 3=3。現在位置為 3。
下一個數字是 2,因此數字的位置將為 3*4 1,因為目前位置是 3 乘以 4,加上目前數字的位置得到位置 13,即數字的位置序列中有 52 個。
為了解決這個問題,我們只需將位置初始化為 0。然後繼續檢查每個數字,直到數字的最後一位,並相應地更新位置 -
對於數字 2,位置將為位置*4 1。
對於數字 3,位置將為位置*4 2。
對於數字 5,位置將為位置*4 3。
對於數字 7,位置將為位置*4 4。
我們透過乘以 4 來更新位置,因為對於每個可能的數字,我們只能做出 4 種組合。所以每次將位置乘以4並加上目前數字的位置,我們就可以得到數字N的位置,其數字只有2、3、5或7。
我們將在我們的方法中使用此演算法,以便有效地解決問題。
在我們的方法中實作演算法以列印僅由 2、3、5 或 7 組成的數字 N 的位置時應遵循的步驟 -
我們將建立一個函數來取得給定數字的位置,其數字僅為 2、3、5 或 7。
我們將以字串的形式取得輸入數字 N。
因此,從 i=0 到 i
對於第一種情況,如果第 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 的位置的演算法,我們在我們的方法中實現了該演算法以解決該問題在O(n) 時間內高效地使用C ,無需使用任何額外空間。
我希望讀完這篇文章後您能夠理解這個問題以及用 C 解決這個問題的方法。
以上是2, 3, 5, 7組成的數字中,n的位置是多少?的詳細內容。更多資訊請關注PHP中文網其他相關文章!