【leetcode-Python】- Math类型-1015 Smallest Integer Divisible by K

目录

 

题目链接

题目描述

示例

解题思路

Python实现


题目链接

1015. Smallest Integer Divisible by K

题目描述

给定正整数K,找出能被K整除的、各位为数字1的最小正整数N并返回N的位数。如果不存在这样的N,返回-1。1\leq K \leq 10^5

示例

输入:K = 1

输出:1 

输入:K = 2

输出:-1 

(因为在 1,11,111,....中无法找到能被2整除的数)

输入:K = 3

输出:3

(找到的N值为111,长度为3)

解题思路

1、在[1,11,111,1111,...]中一定无法找到能被2或5整除的数,因此当K是2的倍数或者是5的倍数时,返回-1

2、当K等于其他数字时,列表[1,11,111,1111,11111,111111,...]中的前K个数中一定包含能被K整除的数N,即N % K = 0。

因此我们只用循环K次并判断即可。

下面我们用反证法来证明2中的判断。当k != 2且k != 5时,假如列表[1,11,111,1111,...]中的前K个数都不能被K整除,那么这K个数除以K得到的余数一定在[1,2,...,K-1]中,那么一定有两个数(设为N_i,N_j)除以K得到的余数相同。其中N_i为由i个1组成的整数,N_j为由j个1组成的整数,其中 j > i。那么N_j - N_i = 111...100...00,相减结果包含j-i个1,i个0。相减结果还可以由111...1(包含j个1) * 100...00(包含i个0)表示,因为有N_i % K = N_j % K,那么(N_j - N_i)% K = 0。由于K != 2且K != 5,100...00(包含i个0)无法被K整除,那么一定有111...1(包含j个1)能够被K整除。但是这个结果和前提条件(列表[1,11,...,]中的前K个数都不能被K整除)相矛盾,因此能够证明列表[1,11,111,...]中的前K个数中一定有一个能够被K整除。

Python实现

class Solution:
    def smallestRepunitDivByK(self, K: int) -> int:
        if (K % 2 == 0 or K % 5 == 0): #k是偶数,或者K能被5整除
            return -1
        num = 1
        for num_digits in range(1,K+1): # 遍历K个数字
            if(num % K == 0):
                return num_digits 
            num = num * 10 + 1

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值