开发者

C++ prime number generator is not working [closed]

This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center. 开发者_开发问答 Closed 11 years ago.
#include <iostream>
using namespace std;

int checkIfPrime(int num) {
    for (int i = 1; i < num; i++) {
        int result = num / i;
        if (num == result * i) {
                return 0;
        }
    }
}


int main() {
    int i = 3;
    while(1) {  
             int c = checkIfPrime(i);
             if (c != 0) {
                cout << c << "\n";
             }
             i = i + 2;
      }
}

Sorry about posting the wrong code!

When I run this, nothing happens.. Can someone tell me what I am doing wrong?


After the question has completely changed its meaning:

Your CheckIfPrime is just wrong. You're checking divisibility in a very strange way. The general way to check whether a is divisible by b is if(a % b == 0)

That said, your error is that your loop starts with 1. Of course every number is divisible by 1, therefore by your logic, no number is prime. Start with for(int i = 2; .... (Depending on whether you want to consider 1 as prime or not, you might want to test specially for num == 1 initially.)

Also, the end condition is very inefficient. It is enough to check before the square root of num, that is i <= sqrt(num), but since sqrt is a rather slow and imprecise operation, MUCH better is to loop this way:

 for(int i  = 2; i * i < = num; ++i)

Another note - to generate all prime numbers from 1 to some MAX_VAL, your approach is very inefficient. Use the Sieve of Erastothenes.

Some stylistic note: your function should ideally return bool rather than int, and don't forget to return true or 1 after the loop has finished without returning.

Original Answer:

First of all, you need

fprintf(OUTPUT_FILE, "%d", Num); //d instead of s, no & before Num

instead of

fprintf(OUTPUT_FILE, "%s", &Num); 

Second, you use the file I/O extremely inefficiently. Why do you open and close the file for every number? You should open it once, write all numbers, and then close it.

And thirdly, your algorithm doesn't seem to have anything to do with prime numbers... :)

By the way, since the first issue results in Undefined Behavior, you can't complain about any behavior of the program, since it's... well, undefined.


You aren't error checking any of your FileIO - wonder if something's going wrong there. A few ifs could help sort that out. Beyond that, all I see is an app that will fill your HDD real fast if it's working correctly.


The main reason why your prime generator isn't working, that i can see:

for (int i = 1; i < num; i++) {
    int result = num / i;
    if (num == result * i) {
            return 0;
    }
}

You start checking at 1. Since every number / 1 == itself, and every number * 1 == itself, the condition will always be true on the first run; that is, your prime test will always return false. Start at 2 instead.

Once you fix that, you should also make it so that the test returns true if it manages to get all the way through the loop. (Inserting a return 1; after the loop should be enough.)

(BTW, if you care the least bit about efficiency, if ((num & 1) == 0) return 0; for (int i = 3; i * i <= num; i += 2) would be better. But better still would be a sieve of some sort, as mentioned elsewhere.)


int checkIfPrime(int num) {
    for (int i = 1; i < num; i++) {
        int result = num / i;
        if (num == result * i) {
                return 0;
        }
    }
}
  • Missing return 1 at the end of the loop
  • The initial value of i must not be 1. Walk through the first iteration with a pencil and paper and see what happens.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜