给定一个整数N ,任务是找到第 N 个纯数。
A pure number has to satisfy three conditions:
1) It has an even number of digits.
2) All digits are either 4 or 5.
3) And the number is a palindrome.
The Pure number series is: 44, 55, 4444, 4554, 5445, 5555, 444444, 445544, 454454, 455554 and so on.
例子:
Input: 5
Output: 5445
Explanation:
5445 is the 5th pure number in the series.
Input: 19
Output: 45444454
Explanation:
45444454 is the 19th pure number in the series.
方法:我们假设 2 个数字构成一个块。对于每个区块,有 2 个区块编号的纯数字。对于1个块的纯数,有2个1纯数;对于有 2 个块的数字,有 2 2 个数字,依此类推。
- 以 4 开头的纯数字,从位置2块开始–例如,4444 位于 (2 2 -1 = 3) 处,这意味着它在系列中的第三个位置。
- 以 5 开头的纯数字从位置2 block + 2 (block-1) -1 开始,例如,5555 在 (2^2 + 2^1 -1 =5) 这意味着它在系列中的第五个位置。
块中的纯数字本质上夹在两个 4 或 5 之间,并且是所有先前块编号的组合。为了更好地理解它,让我们考虑下面的例子:
- 第一个纯数是 44,第二个纯数是 55。
- 4444(“4”+“44”+“4”)来自前一个块的44
- 4554 (“4”+“55”+“4”) 55 来自前一个区块
- 5445 (“5”+“44”+“5”) 44 来自前一个区块
- 5555 (“5”+“55”+“5”) 55 来自前一个区块
该模式对系列中的所有数字重复。
下面是上述方法的实现:
C++
#include
using namespace std;
// CPP program to find
// the Nth pure num
// Function to check if it
// is a power of 2 or not
bool isPowerOfTwo(int N)
{
double number = log(N)/log(2);
int checker = int(number);
return number - checker == 0;
}
// if a number belongs to 4 series
// it should lie between 2^blocks -1 to
// 2^blocks + 2^(blocks-1) -1
bool isSeriesFour(int N, int digits)
{
int upperBound = int(pow(2, digits)+pow(2, digits - 1)-1);
int lowerBound = int(pow(2, digits)-1);
return (N >= lowerBound) && (N < upperBound);
}
// Method to find pure number
string getPureNumber(int N)
{
string numbers[N + 1];
numbers[0] = "";
int blocks = 0;
int displacement = 0;
// Iterate from 1 to N
for (int i = 1; i < N + 1; i++) {
// Check if number is power of two
if (isPowerOfTwo(i + 1)) {
blocks = blocks + 1;
}
if (isSeriesFour(i, blocks)) {
displacement
= int(pow(2, blocks - 1));
// Distance to previous
// block numbers
numbers[i] = "4" + numbers[i - displacement] + "4";
}
else {
displacement = int(pow(2, blocks));
// Distance to previous
// block numbers
numbers[i] = "5" + numbers[i - displacement] + "5";
}
}
return numbers[N];
}
// Driver Code
int main()
{
int N = 5;
string pure = getPureNumber(N);
cout << pure << endl;
}
// This code is contributed by Surendra_Gangwar
Java
// Java program to find
// the Nth pure number
import java.io.*;
class PureNumbers {
// Function to check if it
// is a power of 2 or not
public boolean isPowerOfTwo(int N)
{
double number
= Math.log(N) / Math.log(2);
int checker = (int)number;
return number - checker == 0;
}
// if a number belongs to 4 series
// it should lie between 2^blocks -1 to
// 2^blocks + 2^(blocks-1) -1
public boolean isSeriesFour(
int N, int digits)
{
int upperBound
= (int)(Math.pow(2, digits)
+ Math.pow(2, digits - 1)
- 1);
int lowerBound
= (int)(Math.pow(2, digits)
- 1);
return (N >= lowerBound)
&& (N < upperBound);
}
// Method to find pure number
public String getPureNumber(int N)
{
String[] numbers
= new String[N + 1];
numbers[0] = "";
int blocks = 0;
int displacement = 0;
// Iterate from 1 to N
for (int i = 1; i < N + 1; i++) {
// Check if number is power of two
if (isPowerOfTwo(i + 1)) {
blocks = blocks + 1;
}
if (isSeriesFour(i, blocks)) {
displacement
= (int)Math.pow(
2, blocks - 1);
// Distance to previous
// block numbers
numbers[i]
= "4"
+ numbers[i - displacement]
+ "4";
}
else {
displacement
= (int)Math.pow(
2, blocks);
// Distance to previous
// block numbers
numbers[i]
= "5"
+ numbers[i - displacement]
+ "5";
}
}
return numbers[N];
}
// Driver Code
public static void main(String[] args)
throws Exception
{
int N = 5;
// Create an object of the class
PureNumbers ob = new PureNumbers();
// Function call to find the
// Nth pure number
String pure = ob.getPureNumber(N);
System.out.println(pure);
}
}
C#
// C# program to find
// the Nth pure number
using System;
class PureNumbers {
// Function to check if it
// is a power of 2 or not
public bool isPowerOfTwo(int N)
{
double number
= Math.Log(N) / Math.Log(2);
int checker = (int)number;
return number - checker == 0;
}
// if a number belongs to 4 series
// it should lie between 2^blocks -1 to
// 2^blocks + 2^(blocks-1) -1
public bool isSeriesFour(
int N, int digits)
{
int upperBound
= (int)(Math.Pow(2, digits)
+ Math.Pow(2, digits - 1)
- 1);
int lowerBound
= (int)(Math.Pow(2, digits)
- 1);
return (N >= lowerBound)
&& (N < upperBound);
}
// Method to find pure number
public string getPureNumber(int N)
{
string[] numbers
= new string[N + 1];
numbers[0] = "";
int blocks = 0;
int displacement = 0;
// Iterate from 1 to N
for (int i = 1; i < N + 1; i++) {
// Check if number is power of two
if (isPowerOfTwo(i + 1)) {
blocks = blocks + 1;
}
if (isSeriesFour(i, blocks)) {
displacement
= (int)Math.Pow(
2, blocks - 1);
// Distance to previous
// block numbers
numbers[i]
= "4"
+ numbers[i - displacement]
+ "4";
}
else {
displacement
= (int)Math.Pow(
2, blocks);
// Distance to previous
// block numbers
numbers[i]
= "5"
+ numbers[i - displacement]
+ "5";
}
}
return numbers[N];
}
// Driver Code
public static void Main()
{
int N = 5;
// Create an object of the class
PureNumbers ob = new PureNumbers();
// Function call to find the
// Nth pure number
string pure = ob.getPureNumber(N);
Console.Write(pure);
}
}
// This code is contributed by chitranayal
Javascript
输出:
5445