目录

力扣找到一个数字的-K-美丽值C

力扣:找到一个数字的 K 美丽值(C++)

一个整数 numk 美丽值定义为 num 中符合以下条件的 子字符串 数目:

  • 子字符串长度为 k
  • 子字符串能整除 num

给你整数 numk ,请你返回 num 的 k 美丽值。

注意:

  • 允许有 前缀 0
  • 0 不能整除任何值。

一个 子字符串 是一个字符串里的连续一段字符序列。

示例 1:

输入:num = 240, k = 2
输出:2
解释:以下是 num 里长度为 k 的子字符串:
- "240" 中的 "24" :24 能整除 240 。
- "240" 中的 "40" :40 能整除 240 。
所以,k 美丽值为 2 。

示例 2:

输入:num = 430043, k = 2
输出:2
解释:以下是 num 里长度为 k 的子字符串:
- "430043" 中的 "43" :43 能整除 430043 。
- "430043" 中的 "30" :30 不能整除 430043 。
- "430043" 中的 "00" :0 不能整除 430043 。
- "430043" 中的 "04" :4 不能整除 430043 。
- "430043" 中的 "43" :43 能整除 430043 。
所以,k 美丽值为 2 。

提示:

  • 1 <= num <= 109
  • 1 <= k <= num.length (将 num 视为字符串)

题解一

to_string():将int转为string

stoi():将string转为int    //在这里用的是strtoll()

strtoll()  :用于将字符串转换为长长整型(long long int)     //使用字符串到数值的转换函数,并检查是否溢出。

substr() 字符串的切片函数

end 是一个 const char* 类型的指针,通常用于遍历或标记字符串中的某个位置。(可以在循环中通过 end++ 逐步移动指针。)

.c_str() 返回一个 const char* 指针,指向 sub首字符 地址。

#include <string>
#include <cstdlib>
#include <cerrno>

using namespace std;

class Solution {
public:
    int divisorSubstrings(int num, int k) {
        string s = to_string(num);
        int n = s.size();
        if (n < k) return 0;
        
        int count = 0;
        for (int i = 0; i <= n - k; ++i) {
            string sub = s.substr(i, k);
            char* end;
            errno = 0; // 重置错误标志
            long long val = strtoll(sub.c_str(), &end, 10);
            
            // 检查转换是否完全成功
            if (end != sub.c_str() + sub.size()) {
                continue;
            }
            
            // 处理溢出情况
            if (errno == ERANGE) {
                // 只有当子字符串等于原字符串时才计数
                if (sub.size() == s.size() && sub == s) {
                    ++count;
                }
                continue;
            }
            
            // 忽略值为0的情况
            if (val == 0) {
                continue;
            }
            
            // 检查是否能整除
            if (num % val == 0) {
                ++count;
            }
        }
        
        return count;
    }
};

题解二

class Solution {
public:
    int divisorSubstrings(int num, int k) {
        long sum = 0 , p = pow(10, k) , n = num;
        //从右往左滑,当没有划到最左边
        while(n / (p / 10) > 0){
            //读取当前数,如果可以整除+1
            int curNum = n % p;
            if(curNum != 0 && num % curNum == 0) sum++;
            n /= 10;
        }
        return sum;
    }
};

官方给的,喜欢喜欢