Вопрос в том, чтобы подсчитать количество цифр в N, которое равномерно делит N. Это мой код для этого -
int evenlyDivides(int N){
int temp = N;
int residue;
int count = 0;
while(temp) {
if (residue = temp % 10 && !(N % residue)) {
count++;
}
temp /= 10;
}
cout << count;
}
Если переменная остатка когда-либо окажется равной нулю (скажем, N = 20), то она не выполнит первое условие оператора if и, следовательно, никогда не достигнет второго условия оператора if (где я нахожу N% остатка). Следовательно, я должен не получить исключение с плавающей запятой. Что мне не хватает?
residue = temp % 10 && !(N % residue)
на самом деле не делает то, что вы думаете. На самом деле он не делает ничего, о чем можно было бы подумать, потому что это неопределенное поведение.
Я буду честен с вами - не было бы проще просто использовать круглые скобки, чтобы получить желаемый результат, чем идти в StackOverflow, задавать вопрос и в этом процессе получать отрицательные голоса? Вы использовали их здесь: (N % residue)
, так почему бы не использовать их с другой стороны &&
?
Вот что я получаю, когда создаю ваше приложение:
/*
* BUILD:
* c:\temp>g++ -g -Wall -pedantic -o x x.cpp
* x.cpp: In function 'int evenlyDivides(int)':
* x.cpp:9:20: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
* 9 | if (residue = temp % 10 && !(N % residue)) {
* | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
Вот где он падает, когда я запускаю его (с N = 20):
if (residue = temp % 10 && !(N % residue)) { // SIGFPE here: temp=2, residue=0
ПРЕДЛАГАЕМОЕ ИЗМЕНЕНИЕ:
if ((residue = temp % 10) && !(N % residue)) { ... }
Ваш трюк понятен, но обычно это плохая практика присваивать оператору if из-за множества возможных типов ловушек. Ваш код является одним из образцов, почему.
Компилятор обрабатывает:
if (residue = temp % 10 && !(N % residue))
как
if (residue = (temp % 10 && !(N % residue)) )
что вполне логично в свете приоритета оператора C++.
Возможное решение:
int evenlyDivides(int N){
int temp = N;
int residue;
int count = 0;
while(temp) {
residue = temp % 10;
if (residue % 10 && !(N % residue)) {
count++;
}
temp /= 10;
}
cout << count;
}
Для хорошего ответа покажите, как решить проблему.
@PeteBecker, готово, хотя я был уверен, что лучше оставить место для домашней работы, чтобы убедиться, что человек усвоил ее и выучил наизусть на практике. Обратите внимание, его вопрос был «Что мне не хватает?», а не «Как это реализовать?».
Постарайтесь быть более щедрым на скобки.