目录
题目链接
1015. Smallest Integer Divisible by K
题目描述
给定正整数K,找出能被K整除的、各位为数字1的最小正整数N并返回N的位数。如果不存在这样的N,返回-1。
示例
输入: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