leetcode第129周赛-1015. Smallest Integer Divisible by K,被K整除的最小整数

寻找最小全1整数M,能被正整数K(1<=K<=1e5)整除。若K因数含2或5则无解。通过M_next = 10 * M + 1不断更新M,检查余数。Python3实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目描述:

给定一个正整数K(1<=K<=1e5),找一个最小整数M(全由1构成,例如1,11,111,11111),使得该整数能被K整除

求最小正整数M

原题链接:https://leetcode.com/problems/smallest-integer-divisible-by-k/


示例-example:

Example 1:

Input: 1
Output: 1
Explanation: The smallest answer is N = 1, which has length 1.

Example 2:

Input: 2
Output: -1
Explanation: There is no such positive integer N divisible by 2.

Example 3:

Input: 3
Output: 3
Explanation: The smallest answer is N = 111, which has length 3.

解决思路:

1)首先很显然,当K的因数包含2或者5时,不可能找到全为1的正整数M满足题意。

2)假设K=113,显然从M=1111开始尝试,首先余数remainder=M%K=94。又因为M_next = 11111 = 10 * M + 1,所以有M_next % K = (10 * (M % K) + 1) % K。后面所有依此类推,直到余数为0(说明找到解)或者余数出现重复(说明无解)。

3)为了解决余数重复出现的问题,需要一个list或者set来进行判断,诸位可以根据自己所掌握的编程语言,自行设计这一环节。


Python3代码:

class Solution:
    def smallestRepunitDivByK(self, K: int) -> int:
        if K%2 == 0 or K%5 == 0:
            return -1
        minlen = 1
        nowrem = 1 % K
        remainderlist = list([])
        while (nowrem != 0) and (nowrem not in remainderlist):
            nowrem = (10 * nowrem + 1) % K
            minlen += 1
        if nowrem == 0:
            return minlen
        else:
            return -1

一些体会:

       1)上述代码实测发现,即使不使用remainderlist来判断余数是否出现也能Accepted。由此猜测,要么是题目给的测试样例过于友好;要么可以得到一条数学推论:任意一个正整数K,如果它的余数不包含2和5,那么一定可以找到一个全由1组成的数字M,使得M能被K整除。关于这个数学推论,在下感觉挺有意思的,不知道有没有数学系的大神可以证明下?

       2)最开始不需要判断K是几位数,然后找一个恰好不小于K的M。因为M从1开始就一直满足前面解题思路中所说的规律,所以直接让M从1开始查找就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值