由 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++ 中解决该问题的方案。