Вывод всех простых чисел от 0 до 10000 с массивами - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть задание на домашнюю работу по выводу всех простых чисел от 0 до 10000 в C #, но я должен использовать массивы в моем решении

Мой код:

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] в <9e6bcdf6e2a44b4eb679270e1ffe39ca>: 0 [ERROR] FATAL UNHANDLED EXCEPTION: System.IndexOutOfRangeException: Index был за пределами массива. в MainClass.Main () [0x00012] в <9e6bcdf6e2a44b4eb679270e1ffe39ca>: 0`

(строка 17 относится к for (int j = 0; j < 10000; j++))

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Первый цикл в вашем коде:

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

По сути, это бесконечный цикл, 1 будет всегда меньше 10000 и, следовательно, никогда не завершится. Все после этого цикла теперь недоступно.

Вы получаете ошибку, потому что после 10 000 циклов вы все равно попытаетесь сделать это:

numbers[i] = i;

И i будет больше 9999, что приведет к IndexOutOfRangeException

После того, как вы исправите это, вы обнаружите, что у вас есть больше проблем, но так как это домашняя работа, вам нужно будет попытаться исправить их самостоятельно

0 голосов
/ 05 сентября 2018

Вам нужно исправить петли 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 < 10000, а ваш третий цикл выдаст ошибку

UPDATE

После прочтения комментария @ "Sani Singh Huttunen" я изменил первый цикл, чтобы начать с 2, чтобы он считал это число как простое число, и это удаляло бы 4 из списка результатов, поскольку это не простое число.

Здесь - рабочий пример

...