首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# %抛出DivideByZeroException

C# %抛出DivideByZeroException
EN

Stack Overflow用户
提问于 2016-05-25 12:29:53
回答 4查看 137关注 0票数 2
代码语言:javascript
复制
    public static List<int> getDenoms(long n)
    {
        List<int> result = new List<int>();
        for (int i = 1; i < n; i++)
        {
            if (n % i == 0)
            {
                result.Add(i);
            }
        }
        return result;
    }

    public static int getHighestPrime(List<int> seq)
    {
        int currentHigh = 1;
        foreach (int number in seq)
        {
            List<int> temp = getDenoms(number);
            if (temp.Count == 1)
            {
                if (number > currentHigh)
                {
                    currentHigh = number;
                }
            }
        }
        return currentHigh;
    }

我有当前代码在C#中运行。我有两种方法。在getDenoms方法中,我假设语句n%我不会抛出任何错误,因为我大于或等于1,但是它确实抛出了该错误。

我使用这两种方法的方式如下:

代码语言:javascript
复制
        Console.WriteLine(getHighestPrime(getDenoms(600851475143)));

对于为什么代码会抛出错误有任何深入的见解吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-25 12:35:25

原因是600851475143太大的而不是int

循环变量iint,但将其与long进行比较。600851475143大于int.MaxValue,因此i最终在int.MinValue上溢出并重新启动。然后它会增加,直到它再次成为0和voilá:

DivideByZeroException

要解决这个问题,也要将循环变量的类型更改为long

代码语言:javascript
复制
for (long i = 1; i < n; i++)
票数 6
EN

Stack Overflow用户

发布于 2016-05-25 12:39:21

'i‘是一个整数,因为'n’是长的,所以在for冰柱'i‘溢出,过一段时间到达'0’值。

Fix: for (长i= 1;i< n;i++)

票数 1
EN

Stack Overflow用户

发布于 2016-05-25 12:39:28

我自己还没有测试过这一点,但是当我查看您的代码时,我发现您的循环使用的是int变量,而您的输入是长的。您正在测试函数的数字,即600851475143,比32位int所能表示的要大。试着把你的变量I改为long。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37437198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档