Дан номер n Найдите количество подчисел размера x в числе num, на которое делится num.
Например, если число 250 и х=2 ответ будет 2 как 250%25==0 и 250 % 50==0.
Может ли кто-нибудь помочь мне с кодом cpp?
class Solution {
public:
int divisorSubstrings(int num, int k) {
string s=to_string(num);
int count=0;
int i=0;
int j=k-1;
string temp = "";
for(int k=i;k<=j;k++)
{
temp.push_back(s[k]);
}
while(j<s.length())
{
if (num%stoi(temp)==0)
count++;
temp.erase(temp.begin() + i-1);
j++;
i++;
temp.push_back(s[j]);
}
return count;
}
};
это показывает ошибку времени выполнения
AddressSanitizer:DEADLYSIGNAL ====== =32=ОШИБКА: AddressSanitizer: SEGV по неизвестному адресу (pc 0x7fa6deaf8cfd bp 0x000000000001 sp 0x7ffc77769a00 T0)=32=Сигнал вызван доступом к памяти READ. ==32==Подсказка: эта ошибка была вызвана разыменованием адреса старшего значения (см. значения регистров ниже). Разберите предоставленный компьютер, чтобы узнать, какой регистр использовался. #0 0x7fa6deaf8cfd (/lib/x86_64-linux-gnu/libstdc++.so.6+0x142cfd) #3 0x7fa6de66e0b2 (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) ОБЗОР: AddressSanitizer: SEGV (/lib /x86_64-linux-gnu/libstdc++.so.6+0x142cfd) =32=ПРЕРЫВАНИЕ
Используйте трассировку стека, чтобы увидеть, что делает ваша программа, вызвавшая ошибку.





У вас есть ряд проблем. Во-первых, использование простых букв для ваших переменных означает, что мы понятия не имеем, для чего эти переменные. Используйте осмысленные имена.
Во-вторых, это:
for(int k=i;k<=j;k++)
У вас есть аргумент для вашего метода под названием k. Теперь вы его затенили. Технически вы можете это сделать, но это действительно очень плохая привычка.
Но настоящая проблема здесь:
temp.erase(temp.begin() + i-1);
i инициализируется значением 0 и никогда не изменяется до тех пор, пока эта строка не запустится в первый раз. Таким образом, вы фактически стираете символ перед началом строки.
Что, по словам отладчика, является причиной ошибки времени выполнения?