Generating numbers that are divisor of their right-rotations

Given a number m, find all numbers which have m digits and are a divisor of their right-rotation. Right-rotation of a number N is the result of rotating the digits of N one place to the right and wrapping the least significant digit around so that it becomes the most significant digit. For example, the right-rotation of 4356 is 6435.

Examples:

Input : 2
Output :
11
22
33
44
55
66
77
88
99

Input : 6
Output:
102564
111111
128205
142857
153846
179487
205128
222222
230769
333333
444444
555555
666666
777777
888888
999999

128205 satisfies the condition as 128205 * 4 = 512820.

Brute force approach:
The simplest approach is to traverse all the numbers which are greater than or equal to 10m-1 and less than 10m and check if they satisfy the required condition. We can check it in constant time, so the time complexity for the whole process is O(10m), which is feasible for only small values of m.

Below is the implementation of above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to Generating numbers that 
// are divisor of their right-rotations 
  
#include <bits/stdc++.h>
using namespace std;
  
    
// Function to check if N is a 
// divisor of its right-rotation 
  
bool rightRotationDivisor(int N)
{
    int lastDigit = N % 10;
    int rightRotation = (lastDigit * pow(10 ,int(log10(N)))) 
                    + floor(N / 10); 
    return (rightRotation % N == 0);
}
    
// Function to generate m-digit 
// numbers which are divisor of 
// their right-rotation 
void generateNumbers(int m)
{
    for (int i=pow(10,(m - 1));i<pow(10 , m);i++) 
        if (rightRotationDivisor(i))
            cout<<i<<endl;
 }
   
// Driver code 
int main()
{
int m = 3;
generateNumbers(m);
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to Generating numbers that  
// are divisor of their right-rotations   
  
public class GFG {
      
    // Function to check if N is a  
    // divisor of its right-rotation 
    static boolean rightRotationDivisor(int N) 
    
        int lastDigit = N % 10
        int rightRotation = (int)(lastDigit * Math.pow(10 ,(int)(Math.log10(N)))  
                        + Math.floor(N / 10));  
        return (rightRotation % N == 0); 
    
          
    // Function to generate m-digit  
    // numbers which are divisor of  
    // their right-rotation  
    static void generateNumbers(int m) 
    
        for (int i= (int)Math.pow(10,(m - 1)); i < Math.pow(10 , m);i++)  
            if (rightRotationDivisor(i)) 
                System.out.println(i); 
     
  
      
    // Driver code
    public static void main(String args[])
    {
        int m = 3
        generateNumbers(m); 
      
    }
    // This Code is contributed by ANKITRAI1
}
   

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program to Generating numbers that are
# divisor of their right-rotations
  
from math import log10
  
# Function to check if N is a
# divisor of its right-rotation
def rightRotationDivisor(N):
    lastDigit = N % 10
    rightRotation = (lastDigit * 10 ** int(log10(N))
                    + N // 10)
    return rightRotation % N == 0
  
# Function to generate m-digit
# numbers which are divisor of
# their right-rotation
def generateNumbers(m):
    for i in range(10 ** (m - 1), 10 ** m):
        if rightRotationDivisor(i):
            print(i)
  
# Driver code
m = 3
generateNumbers(m)

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to Generating numbers that 
// are divisor of their right-rotations  
  
using System;
public class GFG{
  
    // Function to check if N is a 
    // divisor of its right-rotation 
    static bool rightRotationDivisor(int N) 
    
        int lastDigit = N % 10; 
        int rightRotation = (int)(lastDigit * Math.Pow(10 ,(int)(Math.Log10(N))) 
                        + Math.Floor((double)N/10)); 
        return (rightRotation % N == 0); 
    
          
    // Function to generate m-digit 
    // numbers which are divisor of 
    // their right-rotation 
    static void generateNumbers(int m) 
    
        for (int i= (int)Math.Pow(10,(m - 1)); i < Math.Pow(10 , m);i++) 
            if (rightRotationDivisor(i)) 
                Console.WriteLine(i); 
    
  
      
    // Driver code 
    public static void Main() 
    
        int m = 3; 
        generateNumbers(m); 
      
    
  
// This code is contributed by 29AjayKumar

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php 
// PHP program to Generating numbers that 
// are divisor of their right-rotations 
  
// Function to check if N is a 
// divisor of its right-rotation 
function rightRotationDivisor($N)
{
    $lastDigit = $N % 10;
    $rightRotation = ($lastDigit * pow(10 , 
                     (int)(log10($N)))) + 
                           floor($N / 10); 
    return ($rightRotation % $N == 0);
}
      
// Function to generate m-digit 
// numbers which are divisor of 
// their right-rotation 
function generateNumbers($m)
{
    for ($i = pow(10, ($m - 1)); 
         $i < pow(10 , $m); $i++) 
        if (rightRotationDivisor($i))
            echo $i . "\n";
}
  
// Driver code 
$m = 3;
generateNumbers($m);
  
// This code is contributed 
// by ChitraNayal
?>

chevron_right


Output:

111
222
333
444
555
666
777
888
999

Time complexity: O(10m)

Efficient approach:
Let dmdm-1..d3d2d1 be the general form of the numbers that we want to generate. Take x = dmdm-1..d3d2 and y = d1. The condition that we want to satisfy is y * 10m – 1 + x = k * (10x + y) where k is a positive integer. Rearranging the terms, we get x = (y * (10m-1 – k)) / (10k – 1). Thus, if we fix the value of y and k, we can get a value of x such that 10x + y is a number we need to generate.

The value of y can range from 1 to 9; observe that we will not have the case y = 0 as that would make the right-rotation y * 10m – 1 + x have m – 1 digits, and the required condition will never be met.

We require x to have exactly m – 1 digits, i.e.

 10^{m - 2} \leq x < 10^{m - 1} \\ \Rightarrow 10^{m - 2} \leq y\frac{10^{m - 1} - k}{10k - 1} < 10^{m - 1} \\ \Rightarrow 10^{m - 1}k - 10^{m - 2} \leq y(10^{m - 1} - k) < 10^{m}k - 10^{m - 1} \\ \Rightarrow \frac{10^{m - 1}(y + 1)}{10^m + y} < k \leq \frac{10^{m - 2}(10y + 1)}{10^{m - 1} + y}

We can observe that the lower bound is always less than unity, so we can keep it at 1 since k has to be a positive integer.

We can use these results to obtain a highly efficient solution which runs with constant time complexity, i.e. O(1). An important point to note that the numbers obtained may not be in sorted form, so we need to store and explicitly sort them if we wish to obtain the numbers in a sorted fashion.

Below is the implementation of above approach:

Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to Generating numbers that 
// are divisor of their right-rotations 
import java.util.*;
import java.io.*;
  
class GFG
{
  
    // Function to generate m-digit 
    // numbers which are divisor of 
    // their right-rotation 
    static void generateNumbers(int m)
    {
            ArrayList<Integer> numbers = new ArrayList<>();
            int k_max, x;
  
            for (int y = 0; y < 10; y++) 
            {
  
                k_max = (int)(Math.pow(10,m-2) * (10 * y + 1)) / 
                                (int)(Math.pow(10, m-1) + y);
  
                for (int k = 1; k <= k_max; k++) 
                {
                        x = (int)(y*(Math.pow(10,m-1)-k)) / (10 * k -1);
  
                        if ((int)(y*(Math.pow(10,m-1)-k)) % (10 * k -1) == 0)
                            numbers.add(10 * x + y);
                }
  
            }
  
            Collections.sort(numbers);
            for (int i = 0; i < numbers.size(); i++)
                System.out.println(numbers.get(i));
    }
  
    // Driver code
    public static void main(String args[])
    {
            int m = 3;
            generateNumbers(m);
    }
}
  
// This code is contributed by rachana soma

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program to Generating numbers that 
# are divisor of their right-rotations 
from math import log10
  
# Function to generate m-digit
# numbers which are divisor of
# their right-rotation
def generateNumbers(m):
    numbers = []
      
    for y in range(1, 10):
        k_max = ((10 ** (m - 2) *
                (10 * y + 1)) //
                (10 ** (m - 1) + y))
          
        for k in range(1, k_max + 1):
            x = ((y * (10 ** (m - 1) - k))
                // (10 * k - 1))
              
            if ((y * (10 ** (m - 1) - k))
                % (10 * k - 1) == 0):
                numbers.append(10 * x + y)
      
    for n in sorted(numbers):
        print(n)
  
# Driver code
m = 3
generateNumbers(m)

chevron_right


Output:

111
222
333
444
555
666
777
888
999

Time complexity: O(1)



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.