Member 12934614 Ответов: 4

Проблема при выполнении программы найти n-е простое число отсутствует.


Ниже приведен код, который я сделал, чтобы найти n-е простое число no, взяв "n" в качестве аргумента в функции ("void prime"). Однако я не получаю ответа, как ожидалось.

Что я уже пробовал:

#include<iostream>
#include<cmath>

using namespace std;

void prime(int n)
{
    int ans=0;
    //int c=0;
    int MAX=1000000;
    int temp=0;
    if(n==1)
    {

        cout<<2;
    }
    else if(n==2)
    {

        cout<<2;

    }
    else
    {

    for (int i=5;i<MAX;i++)
    {
        for (int j=2;j<sqrt;j++)
        {

            if(i%j==0)
                temp=1;
            break;

        }
        if(temp==1)
        ans++;
            if(ans==n)
            {
                cout<<"\n "<<n<<"th prime no. is "<<i;
                    break;
            }
    }
    }

}
int main()
{
    cout<<"\n Enter n";
    int n;
    cin>>n;
    prime(n);
    return 0;
}

Richard MacCutchan

Компилируется ли этот код?

4 Ответов

Рейтинг:
2

Patrice T

if(n==1)
{

    cout<<2;
}
else if(n==2)
{

    cout<<2;

}

Весьма подозрительно, что первое и второе простые числа равны 2.
Это также выглядит так, как будто код не компилируется.

Используйте отладчик, чтобы увидеть, что делает ваш код. Он позволяет выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

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

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[< a href="http://www.codeproject.com/Articles/79508/Mastering-Debugging-in-Visual-Studio-A-Beginn" target= "_blank" title= " New
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
2

KarstenK

Ваша функция простых чисел не работает. Погуглите какой-нибудь действительный код...


Рейтинг:
1

nv3

Прежде всего, пожалуйста, следуйте хорошему совету OriginalGriff: познакомьтесь с использованием отладчика. Это, вероятно, будет самым большим шагом, который вы сделаете в своих навыках программирования до сих пор!

Теперь к вашему вопросу: вы не показали в своем коде, как переменная sqrt вычисляется. Код в его нынешнем виде даже не будет компилироваться.

И второе: вы использовали переменную temp как показатель того, что i это не Прайм. Вы начинаете с предположения, что это простое число, а затем проверяете все целые числа j являются ли они разделителем i Как только вы найдете j значит, это делитель i не может быть простым и вы устанавливаете temp к 1. Пока все хорошо - но тогда вы делаете неправильный вывод:

if (temp==1)
    ans++;
if (ans==n)
{
    cout<<"\n "<<n<<"th prime no. is "<<i;
    break;
}

В переменных ans вы подсчитываете, сколько простых чисел вы уже нашли. Поэтому вы должны увеличить его, если temp равно 0, т. е. без делителя у меня оказалась!

И есть еще один скрытый баг: вы инициализируете temp в самом начале вашей функции. Теперь рассмотрим, что происходит, когда temp в первый раз было установлено значение 1. Что будет со следующим i вы проверяете? Видите, в чем проблема? Это можно легко исправить, но это остается за вами, так как это ваша домашняя работа.


Рейтинг:
0

OriginalGriff

Поэтому используйте отладчик и проследите за тем, что делает ваш код.
Это часть вашей домашней работы, и заставить код работать правильно-часть задачи: действительно, это часто самый интересный и трудоемкий бит!

Поэтому поставьте точку останова в первой строке функции и шагайте по коду, заранее определяя, что должно произойти. Сравните это с тем, что произошло, и когда они не совпадут, вы начнете понимать, почему. Вы можете использовать отладчик для просмотра содержимого переменных, а также пошагового просмотра кода построчно, а для некоторых систем вы даже можете редактировать код во время его выполнения!

Но мы не знаем, какую систему и IDE вы используете, поэтому не можем дать явных инструкций. Google для "отладчика" и названия вашей системы компиляции, и вы должны найти хотя бы основные инструкции о том, как ее использовать.