¿Dónde esta el error? Me piden mostrar los números primos dentro de un rango

#include <iostream>

using namespace std;

int main(){
    int n_inicial;
    int n_final;
    int i;
    int a=0;
    int r;

    cout<<"ingrese el numero inicial :";
    cin>>n_inicial;
    cout<<"ingrese el numero final :";
    cin>>n_final;

    r=n_inicial+1;

    for(int i=r;i<n_final;i++){
        for(int j=1;j<=i;j++){
            if(i%j==0){
                a=a+1;
            }
        }

        if(a==2){
            cout<<i<<endl;
        }
    }

    return 0;
}

Mi código compila pero cuando pongo por ejemplo n_inicial = 20 y n_final = 40 solo me imprime un numero y ahí queda.

1
задан 29.09.2016, 14:27
2 ответа

Проблема - что a (что является счетчиком делителей числа, которое обработано) инициализируется вне первого цикла for. Что это значит? Что стоимость a только он увеличится с каждым числом, которое будет обработано, и хотя число будет первым, a он произойдет стоения 2, когда 2 стоить + стоимость, которая у него была раньше, тогда конечная проверка (if(a==2)) всегда он не удастся.

Решение состояло бы в том, чтобы повторно включать стоимость a в 0 в начале цикла for:

for(int i=r;i<n_final;i++){

    a = 0; // inicializa el valor de a para cada número que se vaya a comprobar

    for(int j=1;j<=i;j++){
        if(i%j==0){
            a=a+1;
        }

     }
    if(a==2){
        cout<<i<<endl;
    }
}
3
ответ дан 24.11.2019, 13:17
  • 1
    Хорошо и # 241; полет ошибка. Но есть многочисленные неудачи стиля (не использованные, не инициализировавшие переменные, с повторенным именем или с коротким именем) и алгоритма (он подтверждает n и # 250; простые пары, как только был найден первый делитель он продолжает считать). В общем дай sensaci и # 243; n, что у Рикардо Товар есть проблемы comprensi и # 243; n C ++ много м и # 225; s обремени, что восстановление переменных в начале циклов. Это, не считая, что, если он отложил c и # 243; я говорю шаг - a-paso habr и # 237; в vistu Ваша неудача немедленно, что заставляет думать, что даже не intent и # 243;. –  PaperBirdMaster 27.09.2016, 12:11
  • 2
    @PaperBirdMaster Неудачи стиля и алгоритма свойственные человеку, что est и # 225; изучая, и что следовательно в и # 250; n не tendr и # 225; передовые знания ни языка ни алгоритмов. В самом деле, это кажется заданием Programaci и # 243; n I. Пробовать немного м и # 225; s передовое существо и # 237; в нерациональный, потому что 1) может, что OP это не понял, и 2) может путать и(или) проваливать OP. В моем opini и # 243; n правильное состоит в том, чтобы ограничивать soluci и # 243; n в попросившее в вопросе и в уровне, сходном с уровнем вопроса, вместо reescribirla и давать что-то полностью новое, что может быть совершенным но далеко от ожидаемого уровня. –  Alvaro Montoro♦ 09.10.2016, 06:11
  • 3
    хороший, если, я новый в этом мир. я изучаю программирование 1 –  Ricardo Tovar 10.10.2016, 04:46
  • 4
    @RicardoTovar Из-за любопытства, и #191; ты понимаешь из-за qu и # 233; в другой ответ он помещает себе std::cout вместо cout? и #191; или для qu и # 233; они подают {} despu и # 233; s переменных? и #191; Или из-за qu и # 233; у цикла for есть vac и # 237; схвати какие-то части внутри пары и # 233; ntesis? –  Alvaro Montoro♦ 10.10.2016, 16:28

Проблема.

Поскольку уже указал Альваро Монторо, твой счетчик делителей a он не восстанавливает Вашу стоимость в 0 в каждом возвращении цикла; если в твоих числах ввода ты не найдешь первое число в первую, никогда он не найдет никакого первого числа, так как этот счетчик не прекратит увеличиваться.

Мой код составляет, но когда я помещаю например n_inicial = 20 и n_final = 40 только меня печатает число и там остается.

Это не является верным. Я протестировал твой код и он не ведет себя так. В первом раунде a уже он не стоит 2 обнаружив делители числа 21 и с этого времени вырасти способствуя невозможно тому, чтобы никогда он не получил стоимость 2 в первом раунде, потребованный, чтобы показывать по крайней мере число. Это мочь быть верно, если бы начальное число пошло 40 так как 41 он первый.


У твоего кода есть серия проблем стиля и алгоритма:

  • Стиль.
    1. Переменная i main он не используется, остается скрытой из-за переменной i твоего первого цикла for.
    2. Не считая переменных циклов for ты инициализируешь только переменную.
    3. Имена каких-то переменных очень короткие и не являются авто-объяснительными, будучи сложно понимать код.
  • Алгоритм.
    1. Ты подтверждаешь, первые ли четные числа, когда уже мы знаем прямо, что они это не будут быть.
    2. Как только был найден делитель, ты продолжаешь пробегать цикл, когда уже мы знаем, что с по крайней мере делителем (различный 1) он не будет быть кузеном.
      • Говоря об этом: почему ты подтверждаешь, делимый ли он из-за 1 если уже известно, что любое целое число делимое из-за 1?

Предложение.

Мое приближение попробовало бы решать полосатые проблемы:

int main()
{
    // Tan solo necesitamos las variables inicial y final.
    int n_inicial{}, n_final{};

    std::cout << "\ningrese el numero inicial :";
    std::cin  >> n_inicial;
    std::cout << "\ningrese el numero final :";
    std::cin  >> n_final;
    std::cout << '\n';

    /* Recorremos los numeros del inicial al final pero
    empezamos por el inicial + 1 si inicial es par.
    También avanzamos los números de 2 en 2 para saltar
    los numeros pares. */
    for (int numero { n_inicial % 2 ? n_inicial : n_inicial + 1 }; numero < n_final; numero += 2)
    {
        /* Empezamos intentando dividir entre 3 pues ya sabemos
        que no estamos considerando numeros pares. El bucle se
        interrumpe tan pronto como encuentre un divisor, evitando
        hacer comprobaciones sobre numeros que ya sabemos que no
        seran primos. */
        int divisor{3};
        for (; (divisor < numero) && (numero % divisor); ++divisor);

        /* Llegados a este punto, si el ultimo divisor del numero
        es el propio numero, significa que el numero es primo. */
        if (divisor == numero)
            std::cout << numero << '\n';
    }
}

Ты можешь видеть код функционируя [здесь]. Имей в виду, что предыдущий код не покажет как кузены числа 1 и 2.

1
ответ дан 24.11.2019, 13:17

Теги

Похожие вопросы