Largest even digit number not greater than N
Given a number N, we need to write a program to find the largest number not greater than N which has all digits even.
Examples:
Input: N = 23
Output: 22
Explanation: 22 is the largest number not
greater than N which has all digits even.
Input: N = 236
Output: 228
Explanation: 228 is the largest number not
greater than N which has all digits even.
Naive Approach: A naive approach is to iterate from N to 0, and find the first number which has all of its digits even.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int checkDigits( int n)
{
while (n) {
if ((n % 10) % 2)
return 0;
n /= 10;
}
return 1;
}
int largestNumber( int n)
{
for ( int i = n;; i--)
if (checkDigits(i))
return i;
}
int main()
{
int N = 23;
cout << largestNumber(N);
return 0;
}
|
Java
import java .io.*;
public class GFG {
static int checkDigits( int n)
{
while (n > 0 )
{
if (((n % 10 ) % 2 ) > 0 )
return 0 ;
n /= 10 ;
}
return 1 ;
}
static int largestNumber( int n)
{
for ( int i = n;; i--)
if (checkDigits(i) > 0 )
return i;
}
static public void main (String[] args)
{
int N = 23 ;
System.out.println(largestNumber(N));
}
}
|
Python3
def checkDigits(n):
while (n> 0 ):
if ((n % 10 ) % 2 ):
return False ;
n = int (n / 10 );
return True ;
def largestNumber(n):
for i in range (n, - 1 , - 1 ):
if (checkDigits(i)):
return i;
N = 23 ;
print (largestNumber(N));
|
C#
using System;
public class GFG {
static int checkDigits( int n)
{
while (n > 0)
{
if (((n % 10) % 2) > 0)
return 0;
n /= 10;
}
return 1;
}
static int largestNumber( int n)
{
for ( int i = n;; i--)
if (checkDigits(i) > 0)
return i;
}
static public void Main ()
{
int N = 23;
Console.WriteLine(largestNumber(N));
}
}
|
PHP
<?php
function checkDigits( $n )
{
while ( $n )
{
if (( $n % 10) % 2)
return 0;
$n /= 10;
}
return 1;
}
function largestNumber( $n )
{
for ( $i = $n ; ; $i --)
if (checkDigits( $i ))
return $i ;
}
$N = 23;
echo (largestNumber( $N ));
?>
|
Javascript
<script>
function checkDigits(n)
{
while (n > 0)
{
if (((n % 10) % 2) > 0)
return 0;
n = parseInt(n/ 10);
}
return 1;
}
function largestNumber(n)
{
for (i = n;; i--)
if (checkDigits(i) > 0)
return i;
}
var N = 23;
document.write(largestNumber(N));
</script>
|
Output:
22
Time Complexity: O(N)
Efficient Approach: We can obtain the required number by decreasing the first odd digit in N by one and then replacing all digits to the right of that odd digit with the largest even digit (i.e. 8). For example, if N = 24578, then X = 24488. In some cases, this approach can create a leading 0, we can simply drop the leading 0 in that case. For example, if N = 1334 then X = 0888. So, our answer will be X = 888. If there are no odd digits in N, then N is the number itself.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int largestNumber( int n)
{
string s = "" ;
int duplicate = n;
while (n) {
s = char (n % 10 + 48) + s;
n /= 10;
}
int index = -1;
for ( int i = 0; i < s.length(); i++) {
if ((s[i] - '0' ) % 2 & 1) {
index = i;
break ;
}
}
if (index == -1)
return duplicate;
int num = 0;
for ( int i = 0; i < index; i++)
num = num * 10 + (s[i] - '0' );
num = num * 10 + (s[index] - '0' - 1);
for ( int i = index + 1; i < s.length(); i++)
num = num * 10 + 8;
return num;
}
int main()
{
int N = 24578;
cout << largestNumber(N);
return 0;
}
|
Java
class GFG
{
static int largestNumber( int n)
{
String s = "" ;
int duplicate = n;
while (n > 0 )
{
s = ( char )(n % 10 + 48 ) + s;
n /= 10 ;
}
int index = - 1 ;
for ( int i = 0 ; i < s.length(); i++)
{
if (((( int )(s.charAt(i) - '0' ) % 2 ) & 1 ) > 0 )
{
index = i;
break ;
}
}
if (index == - 1 )
return duplicate;
int num = 0 ;
for ( int i = 0 ; i < index; i++)
num = num * 10 + ( int )(s.charAt(i) - '0' );
num = num * 10 + (( int )s.charAt(index) - ( int )( '0' ) - 1 );
for ( int i = index + 1 ; i < s.length(); i++)
num = num * 10 + 8 ;
return num;
}
public static void main (String[] args)
{
int N = 24578 ;
System.out.println(largestNumber(N));
}
}
|
Python3
import math as mt
def largestNumber(n):
s = ""
duplicate = n
while (n > 0 ):
s = chr (n % 10 + 48 ) + s
n = n / / 10
index = - 1
for i in range ( len (s)):
if (( ord (s[i]) - ord ( '0' )) % 2 & 1 ):
index = i
break
if (index = = - 1 ):
return duplicate
num = 0
for i in range (index):
num = num * 10 + ( ord (s[i]) - ord ( '0' ))
num = num * 10 + ( ord (s[index]) -
ord ( '0' ) - 1 )
for i in range (index + 1 , len (s)):
num = num * 10 + 8
return num
N = 24578
print (largestNumber(N))
|
C#
using System;
class GFG
{
static int largestNumber( int n)
{
string s = "" ;
int duplicate = n;
while (n > 0)
{
s = ( char )(n % 10 + 48) + s;
n /= 10;
}
int index = -1;
for ( int i = 0; i < s.Length; i++)
{
if (((( int )(s[i] - '0' ) % 2) & 1) > 0)
{
index = i;
break ;
}
}
if (index == -1)
return duplicate;
int num = 0;
for ( int i = 0; i < index; i++)
num = num * 10 + ( int )(s[i] - '0' );
num = num * 10 + (( int )s[index] - ( int )( '0' ) - 1);
for ( int i = index + 1; i < s.Length; i++)
num = num * 10 + 8;
return num;
}
static void Main()
{
int N = 24578;
Console.WriteLine(largestNumber(N));
}
}
|
PHP
<?php
function largestNumber( $n )
{
$s = "" ;
$duplicate = $n ;
while ( $n )
{
$s = chr ( $n % 10 + 48). $s ;
$n =(int)( $n /10);
}
$index = -1;
for ( $i = 0; $i < strlen ( $s ); $i ++)
{
if (ord( $s [ $i ] - '0' ) % 2 & 1)
{
$index = $i ;
break ;
}
}
if ( $index == -1)
return $duplicate ;
$num = 0;
for ( $i = 0; $i < $index ; $i ++)
$num = $num * 10 + (ord( $s [ $i ]) - ord( '0' ));
$num = $num * 10 + ((ord( $s [ $i ]) - ord( '0' )) - 1);
for ( $i = $index + 1; $i < strlen ( $s ); $i ++)
$num = $num * 10 + 8;
return $num ;
}
$N = 24578;
echo largestNumber( $N );
?>
|
Javascript
<script>
function largestNumber(n)
{
var s = "" ;
var duplicate = n;
while (n > 0)
{
s = String.fromCharCode(n % 10 + 48) + s;
n = parseInt(n/10);
}
var index = -1;
for (i = 0; i < s.length; i++)
{
if ((((s.charAt(i).charCodeAt(0) - '0' .charCodeAt(0)) % 2) & 1) > 0)
{
index = i;
break ;
}
}
if (index == -1)
return duplicate;
var num = 0;
for (i = 0; i < index; i++)
num = num * 10 + (s.charAt(i).charCodeAt(0) - '0' .charCodeAt(0));
num = num * 10 + (s.charAt(index).charCodeAt(0) - ( '0' ).charCodeAt(0) - 1);
for (i = index + 1; i < s.length; i++)
num = num * 10 + 8;
return num;
}
var N = 24578;
document.write(largestNumber(N));
</script>
|
Output:
24488
Time Complexity: O(M), where M is the number of digits
Space complexity of the given program is O(logN), as the input integer N is converted to a string s of size logN for easy operations. The other variables used in the program take constant space.
Last Updated :
25 Apr, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...