Учитывая число n, найдите наибольшее число, меньшее или равное n, и цифры в неубывающем порядке.
Примеры:
Input : n = 200
Output : 199
If the given number is 200, the largest
number which is smaller or equal to it
having digits in non decreasing order is
199.
Input : n = 139
Output : 139
Метод 1 (грубая сила)
Начните с n, для каждого номера проверяйте, если его цифры находятся в не убывающем порядке. Если да, то вернитесь. Иначе проверяйте чек на следующий номер, пока не найдем результат.
C ++
#include<bits/stdc++.h>
using namespace std;
long long nondecdigits( long long n)
{
long long int x = 0;
for (x=n; x>=1; x--)
{
int no = x;
int prev_dig = 11;
bool flag = true ;
while (no != 0)
{
if (prev_dig < no%10)
{
flag = false ;
break ;
}
prev_dig = no % 10;
no /= 10;
}
if (flag == true )
break ;
}
return x;
}
int main()
{
long long n = 200;
cout << nondecdigits(n);
return 0;
}
|
Джава
import java.io.*;
class GFG
{
static int nondecdigits( int n)
{
int x = 0 ;
for (x = n; x >= 1 ; x--)
{
int no = x;
int prev_dig = 11 ;
boolean flag = true ;
while (no != 0 )
{
if (prev_dig < no % 10 )
{
flag = false ;
break ;
}
prev_dig = no % 10 ;
no /= 10 ;
}
if (flag == true )
break ;
}
return x;
}
public static void main (String[] args)
{
int n = 200 ;
System.out.println (nondecdigits(n));
} }
|
Python 3
def nondecdigits( n):
x = 0
for x in range (n, 0 , - 1 ):
no = x
prev_dig = 11
flag = True
while (no ! = 0 ):
if (prev_dig < no % 10 ):
flag = False
break
prev_dig = no % 10
no / / = 10
if (flag = = True ):
break
return x
if __name__ = = "__main__" :
n = 200
print (nondecdigits(n))
|
C #
using System;
class GFG
{
static int nondecdigits( int n)
{
int x = 0;
for (x = n; x >= 1; x--)
{
int no = x;
int prev_dig = 11;
bool flag = true ;
while (no != 0)
{
if (prev_dig < no % 10)
{
flag = false ;
break ;
}
prev_dig = no % 10;
no /= 10;
}
if (flag == true )
break ;
}
return x;
}
static public void Main ()
{
int n = 200;
Console.WriteLine(nondecdigits(n));
} }
|
PHP
<?php
function nondecdigits( $n )
{
$x = 0;
for ( $x = $n ; $x >= 1; $x --)
{
$no = $x ;
$prev_dig = 11;
$flag = true;
while ( $no != 0)
{
if ( $prev_dig < $no %10)
{
$flag = false;
break ;
}
$prev_dig = $no % 10;
$no /= 10;
}
if ( $flag == true)
break ;
}
return $x ;
}
$n = 200;
echo nondecdigits( $n );
?>
|
Выход:
199
Эффективный подход
Метод, рассмотренный выше, не очень эффективен, поскольку дает результаты только для чисел до 10 ^ 5, но если число очень велико, так что оно содержит 10 ^ 5 цифр.
Итак, мы обсудим другой метод для таких больших чисел.
Шаг 1: Сохраните цифры числа в массиве или в векторе.
Шаг 2: Начните обход массива от цифры с крайней правой позиции до крайней левой в данном номере.
Шаг 3: Если цифра больше, чем цифра справа от нее, запишите индекс этой цифры в этом массиве и уменьшите эту цифру на единицу.
Шаг 4: Продолжайте обновлять этот индекс до тех пор, пока вы полностью не пройдете массив соответственно, как обсуждалось в шаге 3
Шаг 4: Установите все цифры прямо к этому индексу как 9.
Шаг 5: Распечатайте массив, так как это необходимый номер.
Предположим, что число равно 200, цифры будут 2, 0, 0. Индекс, в котором крайняя левая цифра больше, чем правая цифра, является индексом 1 (после 1-го индекса), поэтому число в индексе 1 будет 2 — 1 = 1 и все цифры справа от него будут 9. Таким образом, окончательный массив будет 1, 9, 9. И требуемое число будет 199.
C ++
#include<bits/stdc++.h>
using namespace std;
void nondecdigits(string s)
{
long long m = s.size();
long long a[m];
for ( long long i=0; i<m; i++)
a[i] = s[i] - '0' ;
long long level = m-1;
for ( long long i=m-1; i>0; i--)
{
if (a[i] < a[i-1])
{
a[i-1]--;
level=i-1;
}
}
if (a[0] != 0)
{
for ( long long i=0; i<=level; i++)
cout << a[i];
for ( long long i=level+1; i<m; i++)
cout << "9" ;
}
else
{
for ( long long i=1; i<level; i++)
cout << a[i];
for ( long long i=level+1; i<m; i++)
cout << "9" ;
}
}
int main()
{
string n = "200" ;
nondecdigits(n);
return 0;
}
|
Джава
import java.util.*;
class GFG
{
static void nondecdigits(String s)
{
int m = s.length();
int [] a = new int [m + 1 ];
for ( int i = 0 ; i < m; i++)
a[i] = ( int )s.charAt(i) - ( int ) '0' ;
int level = m - 1 ;
for ( int i = m - 1 ; i > 0 ; i--)
{
if (a[i] < a[i - 1 ])
{
a[i - 1 ]--;
level = i - 1 ;
}
}
if (a[ 0 ] != 0 )
{
for ( int i = 0 ; i <= level; i++)
System.out.print(a[i]);
for ( int i = level + 1 ; i < m; i++)
System.out.print( "9" );
}
else
{
for ( int i = 1 ; i < level; i++)
System.out.print(a[i]);
for ( int i = level + 1 ; i < m; i++)
System.out.print( "9" );
}
}
public static void main(String[] args)
{
String n = "200" ;
nondecdigits(n);
} }
|
python3
def nondecdigits(s):
m = len (s);
a = [ 0 ] * m;
for i in range (m):
a[i] = ord (s[i]) - ord ( '0' );
level = m - 1 ;
for i in range (m - 1 , 0 , - 1 ):
if (a[i] < a[i - 1 ]):
a[i - 1 ] - = 1 ;
level = i - 1 ;
if (a[ 0 ] ! = 0 ):
for i in range (level + 1 ):
print (a[i], end = "");
for i in range (level + 1 , m):
print ( "9" , end = "");
else :
for i in range ( 1 , level):
print (a[i], end = "");
for i in range (level + 1 , m):
print ( "9" , end = "");
n = "200" ;
nondecdigits(n);
|
C #
using System;
class GFG
{
static void nondecdigits( string s)
{
int m = s.Length;
int [] a = new int [m + 1];
for ( int i = 0; i < m; i++)
a[i] = ( int )s[i] - ( int ) '0' ;
int level = m - 1;
for ( int i = m - 1; i > 0; i--)
{
if (a[i] < a[i - 1])
{
a[i - 1]--;
level = i - 1;
}
}
if (a[0] != 0)
{
for ( int i = 0; i <= level; i++)
Console.Write(a[i]);
for ( int i = level + 1; i < m; i++)
Console.Write( "9" );
}
else
{
for ( int i = 1; i < level; i++)
Console.Write(a[i]);
for ( int i = level + 1; i < m; i++)
Console.Write( "9" );
}
}
static void Main()
{
string n = "200" ;
nondecdigits(n);
} }
|
PHP
<?php
function nondecdigits( $s )
{
$m = strlen ( $s );
$a [ $m ] = 0;
for ( $i = 0; $i < $m ; $i ++)
$a [ $i ] = $s [ $i ] - '0' ;
$level = $m - 1;
for ( $i = $m - 1; $i > 0; $i --)
{
if ( $a [ $i ] < $a [ $i - 1])
{
$a [ $i - 1]--;
$level = $i - 1;
}
}
if ( $a [0] != 0)
{
for ( $i = 0;
$i <= $level ; $i ++)
echo $a [ $i ];
for ( $i = $level + 1;
$i < $m ; $i ++)
echo "9" ;
}
else
{
for ( $i = 1; $i < $level ; $i ++)
echo $a [ $i ];
for ( $i = $level + 1;
$i < $m ; $i ++)
echo "9" ;
}
}
$n = "200" ;
nondecdigits( $n );
?>
|
Выход:
199
Сложность времени Сложность времени — O (d), где d — нет. цифр в номере.
Эта статья предоставлена Аюшем Джа . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Найти наибольшее число меньше N с тем же набором цифр
- Наибольшее число, меньшее или равное N, делимое на K
- Наибольшее меньшее число возможно при использовании только одной операции обмена
- Найти наибольшее число с заданным количеством цифр и суммой цифр
- Проверьте, есть ли номер в данном заказе
- Tidy Number (цифры в неубывающем порядке)
- Наибольшее число не больше N, все цифры которого нечетные
- Наибольшее число с заданным набором из N цифр, которое делится на 2, 3 и 5
- Наибольшее число с простыми цифрами
- Найти число натуральных чисел, меньших или равных N, которые имеют нечетное число цифр
- Сумма цифр, равная данному числу в PL / SQL
- Наибольшее число меньше или равно N / 2, которое взаимно просто с N
- Наибольшее число не больше N, которое может стать простым после перестановки его цифр
- Найдите наибольшее число, которое можно сформировать, изменив не более K цифр
- Найдите число x такое, что сумма x и его цифр равна заданному n.
Наибольшее число, меньшее или равное n, и цифры в неубывающем порядке
0.00 (0%) 0 votes