最大数,最大尾随9小于N且大于N-D

给定两个数字 N D .任务是找出小于或等于 N 其中包含尾随9的最大数量,且N与该数字之间的差值不应大于 D . 例如:

null
Input: N = 1029, D = 102Output: 9991029 has 1 trailing nine while 999 has three trailing nine.Also 1029-999 = 30(which is less than 102).Input: N = 10281, D = 1Output: 10281

A. 幼稚的方法 将从N迭代到N-D,并找到尾随9的最大数。 通过一些关键观察,可以找到一种有效的方法。对这个问题的一个关键观察是,最大的数字小于 N 以至少一句话结束( K )九是

[n–(n模10^k)–1]

从N到1的总位数开始遍历k的所有可能值,并检查d是否>N% 10^k     .如果未获得此类值,则最终答案将为N本身。否则,使用上述观察结果检查答案。 以下是上述方法的实施情况。

C++

// CPP to implement above function
#include <bits/stdc++.h>
using namespace std;
// It's better to use long long
// to handle big integers
#define ll long long
// function to count no of digits
ll dig(ll a)
{
ll count = 0;
while (a > 0) {
a /= 10;
count++;
}
return count;
}
// function to implement above approach
void required_number(ll num, ll n, ll d)
{
ll i, j, power, a, flag = 0;
for (i = num; i >= 1; i--) {
power = pow (10, i);
a = n % power;
// if difference between power
// and n doesn't exceed d
if (d > a) {
flag = 1;
break ;
}
}
if (flag) {
ll t = 0;
// loop to build a number from the
// appropriate no of digits containing only 9
for (j = 0; j < i; j++) {
t += 9 * pow (10, j);
}
// if the build number is
// same as original number(n)
if (n % power == t)
cout << n;
else {
// observation
cout << n - (n % power) - 1;
}
}
else
cout << n;
}
// Driver Code
int main()
{
ll n = 1029, d = 102;
// variable that stores no of digits in n
ll num = dig(n);
required_number(num, n, d);
return 0;
}


JAVA

// Java code to implement above function
import java.io.*;
class GFG {
// It's better to use long
// to handle big integers
// function to count no. of digits
static long dig( long a)
{
long count = 0 ;
while (a > 0 )
{
a /= 10 ;
count++;
}
return count;
}
// function to implement above approach
static void required_number( long num, long n, long d)
{
long i, j, power= 1 , a, flag = 0 ;
for (i = num; i >= 1 ; i--)
{
power = ( long )Math.pow( 10 , i);
a = n % power;
// if difference between power
// and n doesn't exceed d
if (d > a)
{
flag = 1 ;
break ;
}
}
if (flag> 0 )
{
long t = 0 ;
// loop to build a number from the
// appropriate no of digits containing
// only 9
for (j = 0 ; j < i; j++)
{
t += 9 * Math.pow( 10 , j);
}
// if the build number is
// same as original number(n)
if (n % power == t)
System.out.print( n);
else {
// observation
System.out.print( n - (n % power) - 1 );
}
}
else
System.out.print(n);
}
// Driver Code
public static void main (String[] args)
{
long n = 1029 , d = 102 ;
// variable that stores no
// of digits in n
long num = dig(n);
required_number(num, n, d);
}
}
// This code is contributed by chandan_jnu


Python3

# Python3 to implement above function
# function to count no of digits
def dig(a):
count = 0 ;
while (a > 0 ):
a / = 10
count + = 1
return count
# function to implement above approach
def required_number(num, n, d):
flag = 0
power = 0
a = 0
for i in range (num, 0 , - 1 ):
power = pow ( 10 , i)
a = n % power
# if difference between power
# and n doesn't exceed d
if (d > a):
flag = 1
break
if (flag):
t = 0
# loop to build a number from the
# appropriate no of digits containing only 9
for j in range ( 0 ,i):
t + = 9 * pow ( 10 , j)
# if the build number is
# same as original number(n)
if (n % power = = t):
print (n,end = "")
else :
# observation
print ((n - (n % power) - 1 ),end = "")
else :
print (n,end = "")
# Driver Code
if __name__ = = "__main__" :
n = 1029
d = 102
# variable that stores no of digits in n
num = dig(n)
required_number(num, n, d)
# this code is contributed by mits


C#

// C# code to implement
// above function
using System;
class GFG
{
// It's better to use long
// to handle big integers
// function to count no. of digits
static long dig( long a)
{
long count = 0;
while (a > 0)
{
a /= 10;
count++;
}
return count;
}
// function to implement
// above approach
static void required_number( long num,
long n,
long d)
{
long i, j, power = 1, a, flag = 0;
for (i = num; i >= 1; i--)
{
power = ( long )Math.Pow(10, i);
a = n % power;
// if difference between power
// and n doesn't exceed d
if (d > a)
{
flag = 1;
break ;
}
}
if (flag > 0)
{
long t = 0;
// loop to build a number
// from the appropriate no
// of digits containing only 9
for (j = 0; j < i; j++)
{
t += ( long )(9 * Math.Pow(10, j));
}
// if the build number is
// same as original number(n)
if (n % power == t)
Console.Write( n);
else
{
// observation
Console.Write(n - (n % power) - 1);
}
}
else
Console.Write(n);
}
// Driver Code
public static void Main()
{
long n = 1029, d = 102;
// variable that stores
// no. of digits in n
long num = dig(n);
required_number(num, n, d);
}
}
// This code is contributed
// by chandan_jnu


PHP

<?php
// PHP to implement above function
// function to count no of digits
function dig( $a )
{
$count = 0;
while ( $a > 0)
{
$a = (int)( $a / 10);
$count ++;
}
return $count ;
}
// function to implement above approach
function required_number( $num , $n , $d )
{
$flag = 0;
for ( $i = $num ; $i >= 1; $i --)
{
$power = pow(10, $i );
$a = $n % $power ;
// if difference between power
// and n doesn't exceed d
if ( $d > $a )
{
$flag = 1;
break ;
}
}
if ( $flag )
{
$t = 0;
// loop to build a number from the
// appropriate no of digits containing only 9
for ( $j = 0; $j < $i ; $j ++)
{
$t += 9 * pow(10, $j );
}
// if the build number is
// same as original number(n)
if ( $n % $power == $t )
echo $n ;
else
{
// observation
echo ( $n - ( $n % $power ) - 1);
}
}
else
echo $n ;
}
// Driver Code
$n = 1029;
$d = 102;
// variable that stores no of
// digits in n
$num = dig( $n );
required_number( $num , $n , $d );
// This code is contributed by mits
?>


Javascript

<script>
// javascript code to implement above function
// It's better to use var
// to handle big integers
// function to count no. of digits
function dig(a)
{
var count = 0;
while (a > 0)
{
a /= 10;
count++;
}
return count;
}
// function to implement above approach
function required_number(num , n , d)
{
var i, j, power=1, a, flag = 0;
for (i = num; i >= 1; i--)
{
power = Math.pow(10, i);
a = n % power;
// if difference between power
// and n doesn't exceed d
if (d > a)
{
flag = 1;
break ;
}
}
if (flag>0)
{
var t = 0;
// loop to build a number from the
// appropriate no of digits containing
// only 9
for (j = 0; j < i; j++)
{
t += 9 * Math.pow(10, j);
}
// if the build number is
// same as original number(n)
if (n % power == t)
document.write( n);
else {
// observation
document.write( n - (n % power) - 1);
}
}
else
document.write(n);
}
// Driver Code
var n = 1029, d = 102;
// variable that stores no
// of digits in n
var num = dig(n);
required_number(num, n, d);
// This code is contributed by 29AjayKumar
</script>


输出:

999

时间复杂性: O(位数)

另一种方法: 方法是将n减去变量num,即9 99 999,依此类推,然后除以temp,即1 10 100 1000,依此类推。如果在任何一点上n小于num,我们将中断并返回ans。对于每次迭代,我们计算一个值x作为(n-num)/temp,然后如果(x*temp)+num大于等于(n-d),这将是我们的ans,具有最多的9个,因为基本上我们将n减少一个因子,并添加num(可能的9个数),因为它是形式9 99 999,以此类推。

以下是上述方法的实施情况:

C++

#include <bits/stdc++.h>
using namespace std;
int maxPossible9s( int n, int d)
{
// initialising temp and ans variable to 1
int temp = 1;
int ans = 1;
int num = 0;
// taking a condition which always holds true
while ( true ) {
// condition to break
if (n < num) {
break ;
}
else {
// x is a factor by which we can calculate the
// most number of 9s and then adding the most
// number of 9s
int x = (n - num) / temp;
// if the condition is true then our ans will be
// the value (x * temp + num) because num is of
// the format 9 99 999 so on and hence gives the
// most number of 9s
if (x * temp + num >= (n - d)) {
ans = x * temp + num;
}
// temp will be of the format 1 10 100 1000
// 10000 and so on
temp *= 10;
// num will be of the format 9 99 999 9999 and
// so on
num = num * 10 + 9;
}
}
return ans;
}
int main()
{
int n = 1029;
int d = 102;
cout << maxPossible9s(n, d) << endl;
}


输出:

999
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享