目标
给定正整数 k ,你需要找出可以被 k 整除的、仅包含数字 1 的最 小 正整数 n 的长度。
返回 n 的长度。如果不存在这样的 n ,就返回-1。
注意: n 可能不符合 64 位带符号整数。
示例 1:
输入:k = 1
输出:1
解释:最小的答案是 n = 1,其长度为 1。
示例 2:
输入:k = 2
输出:-1
解释:不存在可被 2 整除的正整数 n 。
示例 3:
输入:k = 3
输出:3
解释:最小的答案是 n = 111,其长度为 3。
说明:
- 1 <= k <= 10^5
思路
求仅包含数字 1 且能够整除正整数 k 的数字的最小长度,如不存在返回 -1。
通俗讲就是多长的 11111…… 能够整除 k。为了防止溢出可以只考虑余数,关键是停止条件是什么?如何确定是否存在?
如果余数出现重复,由于计算的式子不变,后续会陷入循环。可以使用哈希表记录出现过的余数。或者循环 k 次,由于余数的范围只可能是 0 ~ k - 1 共 k 个,如果循环 k 次还没有使余数为 0,那么根据鸽巢原理一定存在重复的余数。
代码
/**
* @date 2025-11-25 9:26
*/
public class SmallestRepunitDivByK1015 {
public int smallestRepunitDivByK(int k) {
if (k == 1) {
return 1;
}
int res = 1;
int num = 1;
while (res < k) {
num = (num * 10 + 1) % k;
res++;
if (num == 0) {
return res;
}
}
return -1;
}
}
性能
