给定整数N ,任务是打印第N个纯数字。如果一个数字被认为是纯正的
- 它具有偶数位数。
- 所有数字都是4或5 。
- 这个数字是回文。
前几个纯数字是44、55、4444、4554、5445、5555,…
例子:
Input: N = 4
Output: 44 55 4444 5445
Input: N = 10
Output: 44 55 4444 4554 5445 5555 444444 454454 544445 554455
方法:该想法类似于此处讨论的方法。在队列的每个步骤中,我们可以通过在两边分别增加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