Finlandia_C
Finlandia_C

Reputation: 395

Printing prime numbers up to n

I have written some code to ask the user for n, then print the prime numbers up to n. However when I use it, i.e with 10, it only prints the non-prime numbers

 /* Asks for the amount of prime numbers you would like to print, then prints them */

#include <stdio.h>

int main(void)
{
    int n, i, j, check;
    printf("How many prime numbers would you like to print? ");
    scanf("%d", &n);

    for (i = 2; i <= n; i++) {
        check = 0;

        for (j = 2; j < i ; j++) { 
            if (i % j == 0) {
                check = 1;              
                if (check == 1) {
                    printf("%d\n", i);
                }
            }
        }
    }       

    return 0;
}

How many prime numbers would you like to print? 10
4
6
6
8
8
9
10
10

I've tried everything but I think I am missing something really trivial!

Upvotes: 0

Views: 606

Answers (4)

hyprnir
hyprnir

Reputation: 52

try looking at this code

#include <stdio.h>

int IsPrime(int num)
{
    int i = 2;

    for (i = 2; i < num; i++) if (num % i == 0) return 0;

    return 1;
}

int main(void)

{
    int n, i;
    char *nStr = (char*)malloc(10);

    printf("How many prime numbers would you like to print? ");
    fgets(nStr, 9, stdin);
    n = atoi(nStr);

    for (i = 1; i <= n; i++) if (IsPrime(i)) printf("%d\n", i);

    getchar();
    return 0;
}

and about your code, you should print the number only if check remains 0.

Upvotes: 0

Barmar
Barmar

Reputation: 780929

Several problems.

First, when you set check = 1, that means that i divides evenly, so n is not prime, so you shouldn't print it. You should be printing the number when check == 0.

Second, you're printing each time through the inner loop. You should test check at the end of the loop, to ensure that none of the numbers divided it.

As an improvement, there's no need to keep checking once you find one number that divides evenly. So you can break out of the inner loop as soon as you set check = 1.

#include <stdio.h>

int main(void)
{
    int n, i, j, check;
    printf("How many prime numbers would you like to print? ");
    scanf("%d", &n);

    for (i = 2; i <= n; i++) {
        check = 0;

        for (j = 2; j < i ; j++) { 
            if (i % j == 0) {
                check = 1;
                break;
            }
        }
        if (check == 0) {
            printf("%d\n", i);
        }
    }       

    return 0;
}

Upvotes: 1

Chris Thain
Chris Thain

Reputation: 81

As Weather Vane said, the mod operator % returns 0 if i is exactly divisible by j and if this is true then the number is not prime. Your conditional statement is backwards.

#include <stdio.h>
int main(void)
{
   int n, i, j, check;
   printf("How many prime numbers would you like to print? ");
   scanf("%d", &n);

   for (i = 2; i <= n; i++) 
   {
       check = 0;
       for (j = 2; j < i ; j++) 
       { 
           if (i % j == 0) 
           {
               check = 1;
               break;
           }
       }
       if (check == 0)
       {
           printf("%d\n", i);
       }
   }

   return 0;
}

How many prime numbers would you like to print? 10
2
3
5
7

Upvotes: 1

Pawan
Pawan

Reputation: 1605

This is how it should be:

for (i = 2; i <= n; i++)
{
    check = 0;

    for (j = 2; j < i ; j++)
    {

        if (i % j == 0)
        {
            check = 1;
            break;
        }
    }
    if (check == 0)
    {
        printf("%d\n", i);
    }
}

Also, in the inner loop you don't have to divide the number till j < i. You don't have to go beyond i/2.

Upvotes: 2

Related Questions