【问题标题】:how can this program give a floating point error?该程序如何给出浮点错误?
【发布时间】:2017-03-25 18:19:05
【问题描述】:

这是我尝试使用 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);
}

【问题讨论】:

    标签: runtime floating


    【解决方案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);
    }
    

    【讨论】:

    • 大声笑,是的,我的代码本来可以更整洁一些。但即便如此,我还是无法通过第一个 scanf 语句。只要我输入第一个变量 n,它就会给出这个错误。
    • ps。抱歉编辑,我打算编辑我​​的代码。
    • 不用担心。所以我运行了你的代码,我发现对于较大的 n 值,你的变量 k 超出了数组的边界(比如在 a[k]=i )。我不知道这是否是您遇到的问题,但这是一个会导致错误的问题。对于较小的 n,我的代码会在您的最终 for 循环中陷入无限循环(我认为这是一个算法问题)。
    • 是的,我修复了所有问题,但仍然出现同样的错误。但是“浮点表达式(核心转储)”仍然是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多