В чем заключается проблема с этим кодом, чтобы найти количество цифр одного и того же числа, которые делятся на число? - PullRequest
0 голосов
/ 02 апреля 2020

Мой код выдает ошибку времени выполнения:

int findDigits(int n) {
    int count = 0, num = n, rem;

    while (num != 0) {
        rem = num % 10;

        if (n % rem == 0) {
            count++;
        }

        num = num / 10;
    }
    return count;
}

В чем может быть причина?

Ответы [ 4 ]

3 голосов
/ 02 апреля 2020

Проблема в том, что вы попытаетесь вычислить модуль 0 для некоторого числа.

Допустим, вы вводите 10, тогда num будет 10 для первой итерации и rem = 0, потому что 10 % 10 == 0. Затем в условии для оператора if вы попытаетесь вычислить n % rem, равное 10 % 0, что приведет к ошибке.

Вы должны просто отловить этот случай в операторе if, например

if (rem != 0 && n % rem == 0)
{
    ...
}

Это работает, потому что если у вас есть оператор if наподобие if (A && B) {...}, выражение для B будет превышено только в том случае, если выражение для A приведет к true (что будет 1 в c). Это потому, что если A приводит к false, то выражение A && B не может быть true.

.
1 голос
/ 02 апреля 2020

Ваша проблема здесь:

rem=num%10;

if(n%rem==0)

Возможные результаты для остатка находятся в диапазоне 0..9.

Если вы вставите 0 в выражение условия , вы получаете ошибку деления на ноль.

Сначала вы должны проверить, если rem!=0, прежде чем вы можете к вычислению.

0 голосов
/ 02 апреля 2020

Нет ничего плохого в вашей логике c, кроме случаев, когда ди git равен 0.

После того, как вы извлечете ди git из своего номера, rem = num % 10;

Вы должны сначала проверьте, равен ли он 0, прежде чем проверять, делится ли число на эту ди git. Потому что деление на ноль не определено и является источником вашей ошибки. Поэтому не увеличивайте count, если rem == 0.

Например, рассмотрите n = 30:

В первой итерации: rem = 30% 10 = 0 => n % rem => ОШИБКА (попытка 30/0)

Это может произойти на любой итерации, учитывая, что di git равно 0.

Решение:

Изменить

if (n % rem == 0) {
    count++;
}

на:

// making sure that rem is not zero before dividing n by rem
if (rem != 0 && n % rem == 0) {
    count++;
}

В сторону: было бы лучше назвать rem как digit.

0 голосов
/ 02 апреля 2020

Этот код не дает ошибок

#include<stdio.h>
int findDigits(int n) {

int count=0,num=n,rem;

while(num!=0)
{

    rem=num%10;
    if(rem!=0){
    if(n%rem==0)
    {

        count++;

    }
    }
    num=num/10;
}
return count;
}
int main()
{
    printf("%d",findDigits(405)); //enter the numbe to find digits that are divisible
    return 0;
}
...