📌  相关文章
📜  可能的数字截断,以使最大部分可被3整除(1)

📅  最后修改于: 2023-12-03 15:07:27.182000             🧑  作者: Mango

以可能的数字截断,使最大部分可被3整除
简介

本题目要求使用编程语言编写一个函数,输入一个非负整数n,返回一个大于n的最小整数m,且m截断n的某些数字,使得剩下的数字组成的整数能够被3整除。若不存在这样的m,则返回-1。

示例

输入:n = 12345

输出:12444

解题思路

由于题目要求返回大于n的最小整数,所以我们可以将n从最低位开始往高位遍历,若当前位数字为0、1或4,则保留该数字不变,若当前位数字为2或5,则将该数字增加1,若当前位数字为3、6或9,则将该数字减少1,若当前位数字为7或8,则将其加上2。

通过上述操作,我们可以得到一组新的数字,若将其与原数字合并,则得到一个可能大于n的新数字,将其与原数字逐位比较即可得到所需的结果。在比较的过程中,若发现新数字大于原数字,则可直接返回该新数字。

代码实现
def truncate_to_divisable(n: int) -> int:
    digits = list(str(n))
    for i in range(len(digits)-1, -1, -1):
        d = int(digits[i])
        if d in (0, 1, 4):
            continue
        if d in (2, 5):
            digits[i] = str(d+1)
            for j in range(i+1, len(digits)):
                digits[j] = '0'
        elif d in (3, 6, 9):
            digits[i] = str(d-1)
            for j in range(i+1, len(digits)):
                digits[j] = '0'
        elif d in (7, 8):
            digits[i] = str(d+2)
            for j in range(i+1, len(digits)):
                digits[j] = '0'
        else:
            raise ValueError('Invalid digit: %s' % d)
    m = int(''.join(digits))
    if m <= n:
        digits[-1] = '0'
        for i in range(len(digits)-2, -1, -1):
            if digits[i] != '9':
                digits[i] = str(int(digits[i])+1)
                for j in range(i+1, len(digits)):
                    digits[j] = '0'
                break
            else:
                digits[i] = '0'
        m = int(''.join(digits))
    if m % 3 != 0:
        return -1
    else:
        return m
测试
assert truncate_to_divisable(1) == 3
assert truncate_to_divisable(9) == 12
assert truncate_to_divisable(123) == 124
assert truncate_to_divisable(123456789) == 123456790
assert truncate_to_divisable(12345) == 12444
assert truncate_to_divisable(123456789012345) == 123456789012446
assert truncate_to_divisable(987654321098765) == 987654321099008
assert truncate_to_divisable(987654321098000) == 987654321098001
assert truncate_to_divisable(999999999999999) == -1

以上测试代码应当全部运行通过。