leetcode1015. Smallest Integer Divisible by K

题目大意:给定一个正整数k,找到最小的整数n可以被k整除。N是数字1的组合,例如1,11,111,1111...

这道题的关键:

1、余数是循环的;

2、next_mod = (10*pre_mod +1)%k

证明:已有(a+b)%k =(a%k+b%k)%k

next_mod = next%k = (10*pre+1)%k = ((10*pre)%k+1%k)%k = (((10*(pre%k))%k +1%k)%k = ((10*pre_mod)%k +1%k)%k = (10*pre_mod+1)%k

有一点点绕,如果有更简洁的证明方法欢迎留言!

3、如果K的尾数是2,4,5,6,8的话,一定不存在N。简单说明:我们要求的N结尾一定是1,那么一定不能被2的倍数整除。另外我们知道能被5整除的数字的结尾必须是0或者5,所以得证。

class Solution(object):
    def smallestRepunitDivByK(self, K):
        """
        :type K: int
        :rtype: int
        """
        if K % 10 not in {1, 3, 7, 9}: return -1
        mod, mod_set = 0, set()
        for length in range(1, K + 1):
            mod = (10 * mod + 1) % K
            if mod == 0:
                return length
            if mod in mod_set:
                return -1
            mod_set.add(mod)
        return -1

 

转载于:https://www.cnblogs.com/a-little-v/p/10816754.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值