📌  相关文章
📜  查找前N个纯数字

📅  最后修改于: 2021-04-21 23:31:28             🧑  作者: Mango

给定整数N ,任务是打印第N纯数字。如果一个数字被认为是纯正的

  1. 它具有偶数位数。
  2. 所有数字都是45
  3. 这个数字是回文。

前几个纯数字是44、55、4444、4554、5445、5555,…

例子:

方法:该想法类似于此处讨论的方法。在队列的每个步骤中,我们可以通过在两边分别增加4和5(即前一个数字的结尾和开头)来生成下一个数字:

q.push("4" + temp + "4");
q.push("5" + temp + "5");

通过这种方式,我们可以处理回文,甚至长度数

下面是上述方法的实现:

// C++ implementation of the approach
#include 
using namespace std;
  
// Function to print the first n pure numbers
void nPureNumbers(int n)
{
  
    queue q;
    vector ans;
  
    // Push the starting two elements
    q.push("44");
    q.push("55");
    int total = 2;
  
    // While generated numbers are less than n
    while (ans.size() < n) {
  
        string temp = q.front();
        q.pop();
        ans.push_back(temp);
  
        q.push("4" + temp + "4");
        q.push("5" + temp + "5");
    }
  
    // Sorting strings based on their value
    sort(ans.begin(), ans.end(), [](auto s, auto s2) {
        if (s.size() == s2.size())
            return s < s2;
        else
            return s.size() < s2.size();
    });
  
    // Print first n pure numbers
    for (auto i : ans) {
        cout << i << " ";
    }
}
  
// Driver code
int main()
{
    int n = 4;
  
    nPureNumbers(n);
  
    return 0;
}
输出:
44 55 4444 5445

方法2:该方法将偶数回文数分成两个相等的部分,两者相互镜像。想法是使用与翻转二进制位的方法相同的方法来构建第一部分。除外,而不是翻转0和1,而是翻转4和5。稍后,我们使用数字的第一部分和回文属性来创建最终的纯数字。

44, 55, 4444, 4554... can be separated out into 
 4 | 4
 5 | 5
44 | 44
45 | 54
54 | 45
55 | 55

这些数字模仿了第一个“ k”位的二进制数的属性,其中k = 1、2、3,依此类推。

0
 1
00
01
10
11

因此,我们从每次迭代后翻转最后一位开始,然后移至每两次迭代后翻转的(k-1)位,依此类推。第一次,它将被翻转n次,下一次,将被翻转n / 2次,依此类推。

由于n是具有k位的所有可能数字的总和,其中k = 1、2、3…,所以我们的数字将是2 + 4 + 8 +…2 k个数字的总和。我们将n连续除以2,并在n的值等于零时停止,因为将不再需要添加其他位,并且因为在下一次迭代中,该数目将在其取入的元素数目的两倍之后翻转。先前的迭代。

我们可以使用堆栈来存储值,然后按顺序将其弹出,或者通过将数据存储在字符串并简单地反转它来进行操作,这比堆栈使用的空间要少。

#include 
using namespace std;
  
// Creating a function 'pure' that returns the pure number 
// in the form of a string.
string pure(int n)
{
    // initializing string p where the number will be stored
    string p; 
  
    // It keeps on adding numbers as long as n>0
    while (n > 0) { 
  
        // To equalize the value of n to the corresponding flips 
        n--; 
        if (n % 2 == 0)
            p.append("4");
        else
            p.append("5");
  
        // Dividing n by 2 to move to the next bit
        n /= 2; 
    }
  
    int len = p.length(); // Taking the length of the string
    reverse(p.begin(), p.end()); // Reversing the string
  
    for (int i = len - 1; i >= 0; i--) // Building the palindrome
        p += p[i];
  
    return p;
}
  
int main()
{
    for (int i = 1; i <= 10; i++)
        cout << pure(i) << " "; // Print Ith pure number
  
    return 0;
}
输出:
44 55 4444 4554 5445 5555 444444 445544 454454 455554