给定正整数 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
解答:
class Solution {
public:
int smallestRepunitDivByK(int k) {
int point = 0,counts = 0;
long arr[6] = {1,11,111,1111,11111,111111};
for (point = 0 ; point < 6 ; point++)
{
if(arr[point] % k == 0){
break;
}
}
while( point < 6){
if ( arr[point]%10!=0 ){
counts++;
arr[point] = arr[point] / 10;
}else
break;
}
if(counts>0)
return counts;
else
return -1;
}
};
上面这个解法是错误的无法兼顾到所有的可能性
解法二:
由于我们需要计算余数 red = n % k;n从1开始枚举 ;如果不为零的话 更新rednew = (n10+1)%k;
由由于rednew = (n10+1)%k = ((n%k)*10+1)%k = ((redold)*10+1)%k 很明显我们利用余数来找最后是否余数为0,同时不同的数余数不一样若余数相同证明这两个数是倍数关系,这就证明遇到了一个循环了具体可以自己证明一下;
class Solution {
public:
int smallestRepunitDivByK(int k) {
int resid = 1 % k;
int len = 1;
set<int> st;
st.insert(resid);
while(resid != 0){
resid = (resid*10 +1 )%k;
len++;
if(st.find(resid) != st.end()){
return -1;
}
st.insert(resid);
}
return len;
}
};