1015 可被 K 整除的最小整数

题目描述:
给定正整数 K,你需要找出可以被 K 整除的、仅包含数字 1 的最小正整数 N。
返回 N 的长度。如果不存在这样的 N,就返回 -1。

示例 1:
输入:1
输出:1
解释:最小的答案是 N = 1,其长度为 1。

示例 2:
输入:2
输出:-1
解释:不存在可被 2 整除的正整数 N 。

示例 3:
输入:3
输出:3
解释:最小的答案是 N = 111,其长度为 3。

提示:
1 <= K <= 10^5

方法1:
主要思路:解题汇总链接
(1)模拟除法的过程,每次新增一位的1来除以K;
(2)在这个过程中,保存每次的余数,当再次出现相同的余数时,说明一定不能整除;

class Solution {
public:
    int smallestRepunitDivByK(int K) {
        int len=0;//统计长度
        int num=1;//每次新的要除以K的数
        unordered_set<int> st;
        while(true){
            ++len;//更新长度
            num%=K;//求余数
            if(num==0){//说明可以整除,跳出循环
                break;
            }
            if(st.count(num)){//说明之前出现过该余数,不能整除K,返回-1
                return -1;
            }
            st.insert(num);//存储余数
            num=num*10+1;//新增一位1
        }   
        return len;
    }
};

方法2:
主要思路:
(1)确定能被2或5整除的数,一定不能整除全为1组成的数字,故可以直接返回-1;
(2)则其他的数,都可以整除某个全为1的数字,模拟除法的过程即可;

class Solution {
public:
    int smallestRepunitDivByK(int K) {
        if (K % 2 == 0 || K % 5 == 0) {
            return -1;
        }
        int num = 1;
        int len = 1;
        while (num % K != 0) {
            num = num % K;
            num = num * 10 + 1;
            ++len;
        }
        return len;
    }
};

你可能感兴趣的:(LeetCode)