1015.可被K整除的最小整数--中等
题目描述
给定正整数 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、11、111、...是否能被k整除,若能,则立即返回当前数的长度。
具体分析:设当前遍历的数为xold,余数为rold = Xold % k,则下一个遍历的数为Xnew = Xold * 10 + 1,余数为rnew = Xnew % k = (Xold * 10 + 1) % K = ((Xold % k) * 10 + 1) % k = (rold * 10 + 1);于是下一个余数只与前一个余数有关。
因此,我们只需要循环,根据上一次的余数求得当前的余数值,若余数值为0,则表示可以整除,输出当前长度;若此时的余数以及出现过了(对于已出现过的余数,可以用哈希表存储起来),表示不存在能被k整除、且仅含数字1的正整数。
总结:重点是知道取余操作的规则
代码:
#include <unordered_set> using namespace std; int func(int k){ int remainder = 1 % k; unordered_set<int> dic; if(remainder == 0){ return 1; } else{ dic.insert(remainder); } int length = 2; while(true){ remainder = (remainder*10 + 1) % k; if(remainder == 0){ return length; } else{ if(dic.find(remainder) != dic.end()){ return -1; } else{ dic.insert(remainder); } } length++; } }