как эта программа может выдавать ошибку с плавающей запятой?

Это «своего рода» логический вопрос, который я пытался решить с помощью c. Я в основном ввожу все делители числа в массив и добавляю цифры к однозначному числу и сохраняю в переменной «лучший». Но вывод, который я получаю, это «Исключение с плавающей запятой (ядро сброшено)». Думал, что это будет проблема с одним из циклов, но я не могу его найти. Могу ли я узнать, что означает эта ошибка и что ее вызывает?

#include <stdio.h>

void main()
{
int n,a[50],b[50],k=0,l1=0,l2=0,temp,big,bigi,best=0,i,l3;

printf("Enter an integer (less than 10^5):- ");
scanf("%d",&n);

for(i=1;i<=n;i++)
{
    if(n%i==0)
    { 
        a[k]=i;
        k++;
    }
}

for(i=0;i<k;i++)
{
    b[i]=a[i];
}  

for(i=0;i<k;i++)
{
    if(a[i]<10) 
    {
        continue;
    }   
    else
    {
        l3=a[i];
        while(l3>0)
        {
            temp=l3%10;
            l1=l1+temp;
            l3=l3/10;
        }
        if(l1>=10)
        {
            while(l1>0)
            {
                temp=l1%10;
                l2=l2+temp;
                l1=l1/10;
            }
        }
        a[i]=l2;
    }
}

big=a[0];
for(i=0;i<k;i++)
{
    if(a[i]>big) 
    {
        big=a[i];
        bigi=i;
    }
}

for(i=0;i<k;i++)
{
    while(i!=bigi)
    {
        if(a[bigi]==a[i])
        {
            if(b[bigi]>b[i])
            {
                best=a[i];
            }
            else
            {
                best=a[bigi];
            }
        }
    }
    if(best=0)
    {
        best=a[bigi];
    }
}
printf("The best number is :- %d",best);
}

person steve    schedule 25.03.2017    source источник


Ответы (1)


О боже, Стив, твое форматирование кода!

У меня нет ответа, но я готов поспорить, что это как-то связано с индексами массива. Вы создаете массив из 50 элементов.

Затем вы обращаетесь к нему с индексом k, который зависит от вашего ввода! Как вы можете гарантировать, что k не будет больше 49?

Поместите туда несколько отладочных printfs. Везде. Следите за своей переменной k. Посмотрите, что делают ваши циклы и где вы застреваете.

И для моего собственного здравомыслия, и для всех, кто это читает, вот:

#include <stdio.h>

void main()
{
    int n,a[50],b[50],k=0,l1=0,l2=0,temp,big,bigi,best=0,i,l3;

    printf("Enter an integer (less than 10^5):- ");
    scanf("%d",&n);

    for(i=1;i<=n;i++)
    {
        if(n%i==0)
        { 
            a[k]=i;
            k++;
        }
    }

    for(i=0;i<k;i++)
    {
        b[i]=a[i];
    }  

    for(i=0;i<k;i++)
    {
        if(a[i]<10) 
        {
            continue;
        }   
        else
        {
            l3=a[i];
            while(l3>0)
            {
                temp=l3%10;
                l1=l1+temp;
                l3=l3/10;
            }
            if(l1>=10)
            {
                while(l1>0)
                {
                    temp=l1%10;
                    l2=l2+temp;
                    l1=l1/10;
                }
            }
            a[i]=l2;
        }
    }

    big=a[0];
    for(i=0;i<k;i++)
    {
        if(a[i]>big) 
        {
            big=a[i];
            bigi=i;
        }
    }

    for(i=0;i<k;i++)
    {
        while(i!=bigi)
        {
            if(a[bigi]==a[i])
            {
                if(b[bigi]>b[i])
                {
                    best=a[i];
                }
                else
                {
                    best=a[bigi];
                }
            }
        }
        if(best=0)
        {
            best=a[bigi];
        }
    }
    printf("The best number is :- %d",best);
}
person robgrimmer    schedule 25.03.2017
comment
лол, да, мой код мог бы быть немного аккуратнее. Но даже тогда я не могу пройти мимо первого оператора scanf. Как только я ввожу первую переменную, n, она просто выдает эту ошибку. - person steve; 26.03.2017
comment
пс. извините за редактирование, я должен был отредактировать свой код. - person steve; 26.03.2017
comment
Без проблем. Итак, я запустил ваш код и обнаружил, что при больших значениях n ваша переменная k выходит за границы массивов (например, при a[k]=i ). Я не знаю, является ли это проблемой, с которой вы столкнулись, но это проблема, которая приведет к ошибкам. Для меньшего n мой код застрял бы в бесконечном цикле в вашем последнем цикле for (что, как я полагаю, является проблемой алгоритма). - person robgrimmer; 26.03.2017
comment
да, я все исправил, и все же та же ошибка. Но все же, что означает выражение с плавающей запятой (сброс ядра)? - person steve; 26.03.2017