Largest number not greater than N which can become prime after rearranging its digits
Last Updated :
12 Oct, 2022
Given a number N, the task is to find the largest number less than or equal to the given number N such that on rearranging its digits it can become prime.
Examples:
Input : N = 99
Output : 98
Explanation : We can rearrange the digits of
98 to 89 and 89 is a prime number.
Input : N = 84896
Output : 84896
Explanation : We can rearrange the digits of
84896 to 46889 which is a prime number.
Below is the algorithm to find such a largest number num <= N such that digits of num can be rearranged to get a prime number:
Preprocessing Step: Generate a list of all the prime numbers less than or equal to given number N. This can be done efficiently using the sieve of Eratosthenes.
Main Steps: The main idea is to check all numbers from N to 1, if any of the number can be reshuffled to form a prime. The first such number found will be the answer.
To do this, run a loop from N to 1 and for every number:
- Extract the digits of the given number and store it in a vector.
- Sort this vector to get the smallest number which can be formed using these digits.
- For each permutation of this vector, we would form a number and check whether the formed number is prime or not. Here we make use of the Preprocessing step.
- If it is prime then we stop the loop and this is our answer.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
vector< bool > prime(1000001, true );
void sieve()
{
prime[0] = prime[1] = false ;
for ( long long i = 2; i * i <= 1000000; i++) {
if (prime[i]) {
for ( long long j = i * i; j <= 1000000; j += i)
prime[j] = false ;
}
}
}
int findNumber( int n)
{
vector< int > v;
bool flag = false ;
int num;
for (num = n; num >= 1; num--) {
int x = num;
v.clear();
while (x != 0) {
v.push_back(x % 10);
x /= 10;
}
sort(v.begin(), v.end());
while (1) {
long long w = 0;
for ( auto u : v)
w = w * 10 + u;
if (prime[w]) {
flag = true ;
break ;
}
if (flag)
break ;
if (!next_permutation(v.begin(), v.end()))
break ;
}
if (flag)
break ;
}
return num;
}
int main()
{
sieve();
int n = 99;
cout << findNumber(n) << endl;
n = 84896;
cout << findNumber(n) << endl;
return 0;
}
|
Java
import java.util.*;
class GFG{
static boolean [] prime = new boolean [ 1000001 ];
static boolean next_permutation(Vector<Integer> v) {
int p[] = new int [v.size()];
for ( int l = 0 ; l< p.length;l++) {
p[l] = v.elementAt(l);
}
for ( int a = p.length - 2 ; a >= 0 ; --a)
if (p[a] < p[a + 1 ])
for ( int b = p.length - 1 ;; --b)
if (p[b] > p[a]) {
int t = p[a];
p[a] = p[b];
p[b] = t;
for (++a, b = p.length - 1 ; a < b; ++a, --b) {
t = p[a];
p[a] = p[b];
p[b] = t;
}
return true ;
}
return false ;
}
static void sieve()
{
Arrays.fill(prime, true );
prime[ 0 ] = prime[ 1 ] = false ;
for ( int i = 2 ; i * i <= 1000000 ; i++) {
if (prime[i]== true ) {
for ( int j = i * i; j <= 1000000 ; j += i)
prime[j] = false ;
}
}
}
static int findNumber( int n)
{
Vector<Integer> v = new Vector<>();
boolean flag = false ;
int num;
for (num = n; num >= 1 ; num--) {
int x = num;
v.clear();
while (x != 0 ) {
v.add(x % 10 );
x /= 10 ;
}
Collections.sort(v);
while ( true ) {
int w = 0 ;
for ( int u : v)
w = w * 10 + u;
if (prime[w]== true ) {
flag = true ;
break ;
}
if (flag)
break ;
if (!next_permutation(v))
break ;
}
if (flag)
break ;
}
return num;
}
public static void main(String[] args)
{
sieve();
int n = 99 ;
System.out.print(findNumber(n) + "\n" );
n = 84896 ;
System.out.print(findNumber(n) + "\n" );
}
}
|
Python3
from math import sqrt
def next_permutation(a):
for i in reversed ( range ( len (a) - 1 )):
if a[i] < a[i + 1 ]:
break
else :
return False
j = next (j for j in reversed ( range (i + 1 , len (a)))
if a[i] < a[j])
a[i], a[j] = a[j], a[i]
a[i + 1 :] = reversed (a[i + 1 :])
return True
prime = [ True for i in range ( 1000001 )]
def sieve():
prime[ 0 ] = False
prime[ 1 ] = False
for i in range ( 2 , int (sqrt( 1000000 )) + 1 , 1 ):
if (prime[i]):
for j in range (i * i, 1000001 , i):
prime[j] = False
def findNumber(n):
v = []
flag = False
num = n
while (num > = 1 ):
x = num
v.clear()
while (x ! = 0 ):
v.append(x % 10 )
x = int (x / 10 )
v.sort(reverse = False )
while ( 1 ):
w = 0
for u in v:
w = w * 10 + u
if (prime[w]):
flag = True
break
if (flag):
break
if (next_permutation(v) = = False ):
break
if (flag):
break
num - = 1
return num
if __name__ = = '__main__' :
sieve()
n = 99
print (findNumber(n))
n = 84896
print (findNumber(n))
|
C#
using System;
using System.Collections.Generic;
public class GFG {
static bool [] prime = new bool [1000001];
static bool next_permutation(List< int > v) {
int []p = new int [v.Count];
for ( int l = 0; l < p.Length; l++) {
p[l] = v[l];
}
for ( int a = p.Length - 2; a >= 0; --a)
if (p[a] < p[a + 1])
for ( int b = p.Length - 1;; --b)
if (p[b] > p[a]) {
int t = p[a];
p[a] = p[b];
p[b] = t;
for (++a, b = p.Length - 1; a < b; ++a, --b) {
t = p[a];
p[a] = p[b];
p[b] = t;
}
return true ;
}
return false ;
}
static void sieve() {
for ( int j = 0; j < prime.GetLength(0); j++)
prime[j] = true ;
prime[0] = prime[1] = false ;
for ( int i = 2; i * i <= 1000000; i++) {
if (prime[i] == true ) {
for ( int j = i * i; j <= 1000000; j += i)
prime[j] = false ;
}
}
}
static int findNumber( int n) {
List< int > v = new List< int >();
bool flag = false ;
int num;
for (num = n; num >= 1; num--) {
int x = num;
v.Clear();
while (x != 0) {
v.Add(x % 10);
x /= 10;
}
v.Sort();
while ( true ) {
int w = 0;
foreach ( int u in v)
w = w * 10 + u;
if (prime[w] == true ) {
flag = true ;
break ;
}
if (flag)
break ;
if (!next_permutation(v))
break ;
}
if (flag)
break ;
}
return num;
}
public static void Main(String[] args) {
sieve();
int n = 99;
Console.Write(findNumber(n) + "\n" );
n = 84896;
Console.Write(findNumber(n) + "\n" );
}
}
|
Javascript
<script>
var prime = Array(1000001).fill( true );
function next_permutation(v)
{
var p = Array(v.length).fill(0);
for (l = 0; l < p.length; l++) {
p[l] = v[l];
}
for (a = p.length - 2; a >= 0; --a)
if (p[a] < p[a + 1])
for (b = p.length - 1;; --b)
if (p[b] > p[a]) {
var t = p[a];
p[a] = p[b];
p[b] = t;
for (++a, b = p.length - 1; a < b; ++a, --b) {
t = p[a];
p[a] = p[b];
p[b] = t;
}
return true ;
}
return false ;
}
function sieve() {
prime[0] = prime[1] = false ;
for (i = 2; i * i <= 1000000; i++) {
if (prime[i] == true ) {
for (j = i * i; j <= 1000000; j += i)
prime[j] = false ;
}
}
}
function findNumber(n) {
var v = new Array();
var flag = false ;
var num;
for (num = n; num >= 1; num--) {
var x = num;
v = new Array();
while (x != 0) {
v.push(x % 10);
x = parseInt(x/10);
}
v.sort();
while ( true ) {
var w = 0;
v.forEach( function (item) {
w = w * 10 + item;
});
if (prime[w] == true ) {
flag = true ;
break ;
}
if (flag)
break ;
if (!next_permutation(v))
break ;
}
if (flag)
break ;
}
return num;
}
sieve();
var n = 99;
document.write(findNumber(n) + "<br/>" );
n = 84896;
document.write(findNumber(n) + "<br/>" );
</script>
|
Time Complexity: O(MAX*sqrt(MAX)), where MAX is 1000000.
Auxiliary Space: O(MAX), where MAX is 1000000.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...