【问题标题】:Outputting all prime numbers from 0-10000 with arrays使用数组输出 0-10000 的所有素数
【发布时间】:2018-09-05 17:54:04
【问题描述】:

我有一个作业任务是在 C# 中输出 0-10000 的所有素数,但必须在我的解决方案中使用数组

我的代码是:

public static void Main()
{
    Int32[] numbers = new int[10000];

    for (int i = 3; 1 < 10000; i++)
    {
        numbers[i] = i;
    }

    for (int j = 0; j < 10000; j++)
    {
        if (numbers[j] != 0)
        {
            for (int k = 2; (k * j) < 10000; k++)
            {
                numbers[k * j] = 0;
            }
        }
    }

    for (int y = 0; l < 10000; l++)
    {
        if (numbers[l] != 0)
        {
            Console.WriteLine(numbers[l]);
        }
    }
    Console.ReadLine();
}

我不断收到错误:

main.cs(17,5):警告 CS0162:检测到无法访问的代码 编译成功 - 1 个警告

未处理的异常:System.IndexOutOfRangeException:索引超出了数组的范围。 在 MainClass.Main () [0x00012] 在 :0 [错误] 致命的未处理异常:System.IndexOutOfRangeException:索引 超出了数组的范围。 在 MainClass.Main () [0x00012] in :0`

(第 17 行指的是for (int j = 0; j &lt; 10000; j++)

【问题讨论】:

  • int y = 0; l &lt; 10000; l++ 应该是int l = 0; l &lt; 10000; l++
  • 复制粘贴代码不校对的危害
  • 还有int i = 3; 1 &lt; 10000; i++应该是int i = 3; i &lt; 10000; i++
  • 'for (int y = 0; l
  • for (int i = 3; 1 &lt; 10000; i++) 是一个无限循环。之后的一切都无法访问,很快你就会得到一个超出范围异常的索引,因为numbers[i] = i; 只是10000 deep

标签: c# arrays primes


【解决方案1】:

代码中的第一个循环:

for (int i = 3; 1 < 10000; i++)

本质上是一个无限循环,1将总是小于10,000,因此永远不会退出。此循环之后的所有内容现在都无法访问。

你得到你的错误是因为在 10,000 次循环之后你仍然会尝试这样做:

numbers[i] = i;

i 将大于 9999,这将导致 IndexOutOfRangeException

解决此问题后,您会发现有更多问题,但由于这是家庭作业,您需要自己尝试解决这些问题

【讨论】:

  • 修复第一个异常后,还有其他地方会抛出该异常。
  • @RonBeyer 修复后还有很多其他问题。该问题仅询问如何修复他们收到的错误,新问题值得提出新问题。另外,这是家庭作业,我并没有为他们做所有的工作
【解决方案2】:

你需要修复你的for循环,所以它最终是这样的:

for (int i = 2; i < 10000; i++)
{
    numbers[i] = i;
}

for (int j = 0; j < 10000; j++)
{
    if (numbers[j] != 0)
    {
        for (int k = 2; (k * j) < 10000; k++)
        {
            numbers[k * j] = 0;
        }
    }
}

for (int l = 0; l < 10000; l++)
{
    if (numbers[l] != 0)
    {
        Console.WriteLine(numbers[l]);
    }
}

否则,由于验证 1 &lt; 10000,您的第一个循环将是无限的,而您的第三个循环将引发错误

更新

阅读@"Sani Singh Huttunen" 评论后,我将第一个循环更改为以 2 开头,因此它将将该数字视为素数,并且将从结果列表中删除 4,因为这不是素数。

Here 是一个工作示例

【讨论】:

  • 这仍然会给出索引超出范围异常,当 j == 10,000 和 k == 10000 时,它将尝试分配 numbers[10000 * 10000] = 0
  • 但是循环中有(k * j) &lt; 10000的验证
  • 虽然不会得到所有素数。 2 不见了,4 它说是素数,但不是。通过for (int i = 2; i &lt; 10000; i++) 或声明numbers[2] = 2; 轻松修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
相关资源
最近更新 更多