题目:
给定正整数 k
,你需要找出可以被 k
整除的、仅包含数字 1
的最 小 正整数 n
的长度。
返回 n
的长度。如果不存在这样的 n
,就返回-1。
注意: n
可能不符合 64 位带符号整数。
测试用例:
示例一:
输入:k = 1 输出:1 解释:最小的答案是 n = 1,其长度为 1。
示例二:
输入:k = 2 输出:-1 解释:不存在可被 2 整除的正整数 n 。
示例三:
输入:k = 3 输出:3 解释:最小的答案是 n = 111,其长度为 3。
思路分析:
首先,拿到题目可以看出,题目要求所有的被除数的每一位均为1;由此可以将2以及2的倍数和5以及5 的倍数均排除,因为无论如何都不能够整除,所以可以先给一个if条件将2以及2的倍数和5以及5 的倍数直接返回-1,表示无法被整除;然后定义一个变量yu,初始化为1 % k,为了排除 k == 1的情况。如果一个数能够被k整除,则将其乘以10,也将会被k整除。定义一个计数器用于记录位数;详细代码如下:
class Solution {
public int smallestRepunitDivByK(int k) {
if(k % 2 == 0 || k % 5 == 0) {
return -1;
}
int yu = 1 % k;
int count = 1;
while(yu != 0) {
yu = (yu * 10 + 1) % k;
count++;
}
return count;
}
}