📅  最后修改于: 2023-12-03 15:26:26.001000             🧑  作者: Mango
本题可以通过数学方法来解决,不需要进行穷举。
首先,我们先找到小于N的最大数字为9的数(即数的各位都是9)。假设N的位数为n,则小于N的最大数字为9的数为999...,其中9的数量为n。
其次,我们找到小于N且最大尾数为9的数。我们可以将N的个位数替换为9,然后向前一位寻找最小的数字,使得新数小于原数。如果找不到这样的数字,就将新数的十位数替换为9,再重复上述操作,直到新数小于原数为止。
最后,我们只需返回这两个数中较小的那个即可。
以下是实现代码(使用了python语言):
def find_largest_num(n):
"""
找到小于n的最大数字为9的数
"""
digits = len(str(n))
return int('9'*digits)
def find_largest_9_tail_num(n):
"""
找到小于n且最大尾数为9的数
"""
str_n = str(n)
digits = len(str_n)
# 获取新数最高位应该是多少
first_digit = int(str_n[0])+1
if first_digit >= 10:
new_digits = digits + 1
new_num = int('9'*new_digits)
else:
new_num = int(str(first_digit) + '9'*(digits-1))
while new_num >= n:
# 如果新数大于等于原数,则将十位数替换为9,再尝试
new_num = int(str(new_num//10) + '9')
return new_num
def find_num(n):
"""
找到小于n且最大数字、最大尾数为9的数
"""
largest_num = find_largest_num(n)
largest_9_tail_num = find_largest_9_tail_num(n)
return largest_9_tail_num if largest_9_tail_num < largest_num else largest_num
以上就是本题的解题思路和代码实现。