题目描述:
给定一个正整数K(1<=K<=1e5),找一个最小整数M(全由1构成,例如1,11,111,11111),使得该整数能被K整除
求最小正整数M
原题链接:https://leetcode.com/problems/smallest-integer-divisible-by-k/
示例-example:
Example 1:Example 2:Input: 1 Output: 1 Explanation: The smallest answer is N = 1, which has length 1.
Example 3:Input: 2 Output: -1 Explanation: There is no such positive integer N divisible by 2.
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开始查找就行了。