Define a function that takes an integer argument and returns a logical value true
or false
depending on if the integer is a prime.
Per Wikipedia, a prime number ( or a prime ) is a natural number greater than 1
that has no positive divisors other than 1
and itself.
The problem link is here
Requirements
- You can assume you will be given an integer input.
- You can not assume that the integer will be only positive. You may be given negative numbers as well ( or
0
). - NOTE on performance: There are no fancy optimizations required, but still the most trivial solutions might time out. Numbers go up to 2^31 ( or similar, depending on language ). Looping all the way up to
n
, orn/2
, will be too slow.
Example
is_prime(1) /* false */
is_prime(2) /* true */
is_prime(-1) /* false */
Sample Tests
#include <criterion/criterion.h>
#include <stdbool.h>
bool is_prime(int num);
Test(Sample_Test, basic_test)
{
cr_assert_not(is_prime(0), "Your solution returned that 0 is prime, but it's not");
cr_assert_not(is_prime(1), "Your solution returned that 1 is prime, but it's not");
cr_assert(is_prime(2), "Your solution returned that 2 is not prime, but it is");
cr_assert(is_prime(73), "Your solution returned that 73 is not prime, but it is");
cr_assert_not(is_prime(75), "Your solution returned that 75 is prime, but it's not");
cr_assert_not(is_prime(-1), "Your solution returned that -1 is prime, but it's not");
}
Test(Sample_Test, test_prime)
{
cr_assert(is_prime(3), "Your solution returned that 3 is not prime, but it is");
cr_assert(is_prime(5), "Your solution returned that 5 is not prime, but it is");
cr_assert(is_prime(7), "Your solution returned that 7 is not prime, but it is");
cr_assert(is_prime(41), "Your solution returned that 41 is not prime, but it is");
cr_assert(is_prime(5099), "Your solution returned that 5099 is not prime, but it is");
}
Test(Sample_Test, test_not_prime)
{
cr_assert_not(is_prime(4), "Your solution returned that 4 is prime, but it's not");
cr_assert_not(is_prime(6), "Your solution returned that 6 is prime, but it's not");
cr_assert_not(is_prime(8), "Your solution returned that 8 is prime, but it's not");
cr_assert_not(is_prime(9), "Your solution returned that 9 is prime, but it's not");
cr_assert_not(is_prime(45), "Your solution returned that 45 is prime, but it's not");
cr_assert_not(is_prime(-5), "Your solution returned that -5 is prime, but it's not");
cr_assert_not(is_prime(-8), "Your solution returned that -8 is prime, but it's not");
cr_assert_not(is_prime(-41), "Your solution returned that -41 is prime, but it's not");
}
Test(Sample_Test, test_large)
{
cr_assert_not(is_prime(247464361), "Your solution returned that 247464361 is prime, but it's not");
cr_assert(is_prime(1634300119), "Your solution returned that 1634300119 is not prime, but it is");
}
Solution
#include <stdbool.h>
bool is_prime(int num)
{
bool prime = true;
int i, k;
if (num <= 1 || (num % 2 == 0 && num != 2))
prime = false;
k = floor(sqrt(num));
for (i = 3; i <= k; i++)
if (num % i == 0)
prime = false;
return prime;
}