📌  相关文章
📜  最大数字,最大尾数为9,小于N且大于ND

📅  最后修改于: 2021-04-29 13:33:17             🧑  作者: Mango

给定两个数字ND。任务是找出小于或等于N的最大数字,该数字包含尾随9的最大数目,并且N与该数字之间的差不应大于D。
例子:

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

Input: N = 10281, D = 1
Output: 10281

天真的方法是从N到ND进行迭代,并找到尾数最大的数字。
通过一些关键的观察可以找到一种有效的方法。对这个问题的一个关键观察是,小于N且以至少say( K )个九分结尾的最大数是

从N的位数之和开始遍历k的所有可能值,并检查d> n% 10^k   。如果没有获得这样的值,则最终答案将是N本身。否则,请使用以上观察结果检查答案。
下面是上述方法的实现。

C++
// CPP to implement above function
#include 
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 containg 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 containg
        // 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 containg 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 containg 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
 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 containg 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


输出:
999

时间复杂度: O(无数字)