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++;
    }
}

 

posted on 2023-05-11 20:54  笑嘻嘻嘻了  阅读(74)  评论(0)    收藏  举报

导航