由 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 次查看

开启您的职业生涯

通过完成课程获得认证

开始学习
广告