Программа C (простое число в заданном диапазоне) - PullRequest
0 голосов
/ 18 апреля 2020

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

Может кто-нибудь сказать мне, что не так с этой программой, пожалуйста?

#include <stdio.h>
#include <conio.h>

void main() {
    int min, max, i, j, count = 0;
    printf("Enter Your First Number\n");
    scanf("%d", &min);
    printf("Enter Your Last Number\n");
    scanf("%d", &max);
    for(i=min; i<=max; i++) {
        for(j=1; j<=i; j++) {
            if(i % j == 0) {
                count++;
            }
        }
        if(count==2) {
            printf("%d\t",i);
        }
    }
    getch();
}

Ответы [ 4 ]

2 голосов
/ 18 апреля 2020

Я просто предлагаю избавиться от этой count переменной.

Как узнать, является ли число N простым? Если для каждого j в диапазоне (от 2 до N-1) у вас есть N%j != 0.

Итак:

  • Во внутреннем l oop используйте j от 2 до N-1 (вместо от 1 до N, как вы использовали tio do). На самом деле N% 1 и N% N будут 0
  • В первый раз вы найдете j, так что N % j == 0 сломается. Вы уверены, что это не простое число
  • Почему увеличение count? Для простого числа счетчик j будет равен i (потому что вы сделали петлю до j<i, а последний j++ сделал j равен i). Так что просто проверьте j == i и напечатайте простое число i
#include <stdio.h>
#include <conio.h>

int main( void )
{
    int min, max, i, j, count = 0;
    printf("Enter Your First Number\n");
    scanf("%d", &min);
    printf("Enter Your Last Number\n");
    scanf("%d", &max);

    for(i=min; i<=max; i++)
    {
        // Was for(j=1; j<=i; j++)
        for(j=2; j<i; j++)
        {
            if(i % j == 0)
            {
                //Was count++;
                break;
            }
        }

        //Was if(count==2)
        if(j == i)
        {
            printf("%d\t",i);
        }
    }
    getch();

    return 0;
}

1 голос
/ 18 апреля 2020

Вот, пожалуйста.

#include <stdio.h>

int main( void ) 
{
    printf( "Enter the range of numbers (two unsigned integer numbers): " );

    unsigned int first = 0, last = 0;

    scanf( "%u %u", &first, &last );

    if ( last < first )
    {
        unsigned int tmp = first;
        first = last;
        last = tmp;
    }

    do
    {
        int prime = first % 2 == 0 ? first == 2 : first != 1;

        for ( unsigned int i = 3; prime && i <= first / i; i += 2 )
        {
            prime = first % i != 0;
        }

        if ( prime ) printf( "%u ", first ); 
    } while ( first++ != last );

    putchar( '\n' );

    return 0;
}

Вывод программы может выглядеть следующим образом:

Enter the range of numbers (two unsigned integer numbers): 0 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

Что касается вашей программы, то вам необходимо повторно инициализировать переменную count перед внутренним l oop

for(i=min; i<=max; i++) {
    count = 0;
    for(j=1; j<=i; j++) {
        if(i % j == 0) {
            count++;
        }
    }

А внутренний l oop неэффективен.

0 голосов
/ 19 апреля 2020

Вы можете использовать простую функцию isprime, чтобы проверить, является ли число простым или нет, а затем вызвать функцию для заданного интервала.
Чтобы определить, является ли число простым или нет, мы можем использовать простой тест на простоту проверьте это.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


bool isprime(int n)
{
     if(n <= 1) return false;
     if(n <= 3) return true;

     if(n%2 == 0 || n%3 == 0) return false;

     for(int i = 5;i*i <= n;i += 6)
     {
        if(n%i == 0 || n%(i + 2) == 0)
        {
            return false;
        }
     }
     return true;
 }



int main()
{
    int a,b;
    printf("Enter the first number :");
    scanf("%d",&a);
    printf("Enter the second number :");
    scanf("%d",&b);
    for(int i = a;i <= b;i++)
    {
       if(isprime(i)) printf("%d ",i);
    }
    return 0;
 }
0 голосов
/ 18 апреля 2020

Необходимо сбросить значение count. Он начинается с count=0, затем для любых входов циклы будут отсчитываться. Для каждого внешнего индекса l oop он будет go следующим образом:

  • 1 (1%1=0 -> count++, count = 1)
  • 2 (2%1=0 -> count++ и 2%2=0 -> count++, count = 3)
  • 3 (3%1=0 -> count++, и 3%3=0 -> count++, count = 5)

et c ... до достижения max.

...