題目描述:
給定一個正整數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開始查找就行了。