一個整數?
num
?的?k?美麗值定義為?num
?中符合以下條件的?子字符串?數目:
- 子字符串長度為?
k
?。- 子字符串能整除?
num
?。給你整數?
num
?和?k
?,請你返回?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){//讀取當前數,如果可以整除+1int curNum = n % p;if(curNum != 0 && num % curNum == 0) sum++;n /= 10;}return sum;}
};
官方給的,喜歡喜歡