由 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++ 中解決該問題的方案。

更新於:2023 年 4 月 18 日

238 次檢視

開啟您的職業生涯

透過完成課程獲得認證

開始學習
廣告