📜  找出第N个纯数

📅  最后修改于: 2021-04-24 18:13:19             🧑  作者: Mango

给定整数N ,任务是找到第N个纯数。

例子:

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 -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


输出:
5445