Print Highly Prime Numbers in an Input Interval | C Program

AI Thread Summary
The discussion revolves around creating a C program to print highly prime numbers within a specified interval. A highly prime number is defined as one where removing digits from the right still results in prime numbers. The original code contained logic errors, particularly in the `isPrime` function, which incorrectly identified some numbers as prime. After several revisions, a corrected version of the `isPrime` function was proposed, which checks divisibility up to half of the number. The final solution successfully identifies highly prime numbers, although participants noted potential performance improvements could still be made.
gruba
Messages
203
Reaction score
1

Homework Statement


Write a program that will print all highly prime numbers from the input interval <a,b>. Prime number is highly prime if deletion of every digit from right is a prime.

Example:
239 is highly prime because 239,23,2 are primes.

2. The attempt at a solution
Could someone point out what are logic errors in the following program:
Code:
#include <stdio.h>

int isPrime(int p);
int isHighlyPrime(int n);
void printHighlyPrimeNumbers(int a,int b);

// check if p is a prime
int isPrime(int p)
{
  int nd=2;//number of divisors
  int d;//current divisor

  for(d=2; d<p/2; d++)
  {
  if(p % d == 0)
  nd++;
  }
  if(nd == 2)
  return 1;
  return 0;
}

// check if n is highly prime
int isHighlyPrime(int n)
{
  int temp=n;
  int i;
  int digitCount=0;//number of digits in n

  while(temp != 0)
  {
  temp=temp/10;
  digitCount++;
  }
  temp=n;

  //if number of digits is 1, only check if prime
  if(digitCount == 1)
  {
  if(isPrime(temp))
  return 1;
  }

  //else check if n,n/10,(n/10)/10,... are primes
  else
  {
  for(i=1; i<=digitCount-1 && isPrime(temp); i++)
  {
  if(isPrime(temp))
  temp=temp/10;
  }
  return 1;
  }
  return 0;
}

//print highly primes from a to b
void printHighlyPrimeNumbers(int a,int b)
{
  int i;
  for(i=a; i<=b; i++)
  {
  if(isHighlyPrime(i))
  printf("%d ",i);
  }
}

int main()
{
  int a,b;
  do
  {
  printf("a = ");
  scanf("%d",&a);
  }while(a<1);
  do
  {
  printf("b = ");
  scanf("%d",&b);
  }while(b<1);
 
  //swap if a>b
  if(a > b)
  {
  int temp=a;
  a=b;
  b=temp;
  }

  printHighlyPrimeNumbers(a,b);

  return 0;
}
 
Last edited:
Physics news on Phys.org
gruba said:

Homework Statement


Write a program that will print all highly prime numbers from the input interval <a,b>. Prime number is highly prime if deletion of every digit from right is a prime.

Example:
239 is highly prime because 239,23,2 are primes.

2. The attempt at a solution
Could someone point out what are logic errors in the following program:
Code:
#include <stdio.h>

int isPrime(int p);
int isHighlyPrime(int n);
void printHighlyPrimeNumbers(int a,int b);

// check if p is a prime
int isPrime(int p)
{
  int nd=2;//number of divisors
  int d;//current divisor

  for(d=2; d<p/2; d++)
  {
  if(p % d == 0)
  nd++;
  }
  if(nd == 2)
  return 1;
  return 0;
}

// check if n is highly prime
int isHighlyPrime(int n)
{
  int temp=n;
  int i;
  int digitCount=0;//number of digits in n

  while(temp != 0)
  {
  temp=temp/10;
  digitCount++;
  }
  temp=n;

  //if number of digits is 1, only check if prime
  if(digitCount == 1)
  {
  if(isPrime(temp))
  return 1;
  }

  //else check if n,n/10,(n/10)/10,... are primes
  else
  {
  for(i=1; i<=digitCount-1 && isPrime(temp); i++)
  {
  if(isPrime(temp))
  temp=temp/10;
  }
  return 1;
  }
  return 0;
}

//print highly primes from a to b
void printHighlyPrimeNumbers(int a,int b)
{
  int i;
  for(i=a; i<=b; i++)
  {
  if(isHighlyPrime(i))
  printf("%d ",i);
  }
}

int main()
{
  int a,b;
  do
  {
  printf("a = ");
  scanf("%d",&a);
  }while(a<1);
  do
  {
  printf("b = ");
  scanf("%d",&b);
  }while(b<1);

  //swap if a>b
  if(a > b)
  {
  int temp=a;
  a=b;
  b=temp;
  }

  printHighlyPrimeNumbers(a,b);

  return 0;
}
This part I don't get:
Code:
for(i=1; i<=digitCount-1 && isPrime(temp); i++)
  {
  if(isPrime(temp))
  temp=temp/10;
  }
I would keep the for loop simple:
Code:
for(i=1; i<=digitCount-1; i++)
Then, if isPrime(temp) returns 0, isHighlyPrime should immediately return 0.

(Also, note that your isPrime function considers 4 a prime number.)
 
gruba said:
Code:
else
  {
  for(i=1; i<=digitCount-1 && isPrime(temp); i++)
  {
  if(isPrime(temp))
  temp=temp/10;
  }
  return 1;
  }
  return 0;
}
Seems flawed: if it's prime you don't have to IF again. If it's not prime, you should not return 1 .

[edit] quick work Samy !
 
[EDIT]I have figured out the problem, here is the working program:
Code:
#include <stdio.h>

int isPrime(int p);
int isHighlyPrime(int n);
void printHighlyPrimeNumbers(int a,int b);

// check if p is a prime
int isPrime(int p)
{
  int i = 2;
 if(p == 1 || p == 7)
    return 0;
  while(i<p){
  if(!(p % i)) return 0;
  i = 2*i-1;
  }
  return 1;
}

// check if n is highly prime
int isHighlyPrime(int n)
{
  int temp=n;
  int i;
  int digitCount=0;//number of digits in n

  while(temp != 0)
  {
  temp=temp/10;
  digitCount++;
  }
  temp=n;

  //if number of digits is 1, only check if prime
  if(digitCount == 1)
  {
  if(isPrime(temp))
  return 1;
  }

  //else check if n,n/10,(n/10)/10,... are primes
  else
  {
  while(temp>0)
  {
  if(isPrime(temp) == 0)
  {
  return 0;
  }
  temp =temp/10;
  }
  return 1;
  }
  return 0;
}

//print highly primes from a to b
void printHighlyPrimeNumbers(int a,int b)
{
  int i;
  for(i=a; i<=b; i++)
  {
  if(isHighlyPrime(i))
  printf("%d ",i);
  }
}

int main()
{
  int a,b;
  do
  {
  printf("a = ");
  scanf("%d",&a);
  }while(a<1);
  do
  {
  printf("b = ");
  scanf("%d",&b);
  }while(b<1);

  //swap if a>b
  if(a > b)
  {
  int temp=a;
  a=b;
  b=temp;
  }

  printHighlyPrimeNumbers(a,b);

  return 0;
}
 
Last edited:
Some examples: the program treats numbers as 113, 131, 137 ... as highly prime.
Also 77, 371, 377 and 1133, which are not prime.

Something still wrong with the isPrime function.
 
Last edited:
Samy_A said:
Something still wrong with the isPrime function.
I have edit the previous post, but not sure if it will correct possible error.
 
gruba said:
I have edit the previous post, but not sure if it will correct possible error.
gruba said:
[EDIT]I have figured out the problem, here is the working program:
Code:
int isPrime(int p)
{
  int i = 2;
if(p == 1 || p == 7)
    return 0;
  while(i<p){
  if(!(p % i)) return 0;
  i = 2*i-1;
  }
  return 1;
}
Still gives 371 and 373 as primes (as examples).
As 7 is prime, returning 0 when p==7 doesn't make much sense.

The key issue is this: in isPrime, you check if p is divisible by i=2, and then by i=2*2-1=3, i=2*3-1=5, i=2*5-1=9, ...
See the problem?
 
Last edited:
Samy_A said:
Still gives 371 and 373 as primes (as examples).
As 7 is prime, returning 0 when p==7 doesn't make much sense.
In isPrime, you check if p is divisible by i=2, and then by i=2*2-1=3, i=2*3-1=5, i=2*5-1=9.
See the problem?

The following isPrime() function seems to work for interval 50 - 1200:
Code:
int isPrime(int p)
{
  int i;
  if(p == 1)
  return 0;
  for(i=2; i<=p/2; i++)
  if(p % i == 0)
  return 0;
  return 1;
}
 
gruba said:
The following isPrime() function seems to work for interval 50 - 1200:
Code:
int isPrime(int p)
{
  int i;
  if(p == 1)
  return 0;
  for(i=2; i<=p/2; i++)
  if(p % i == 0)
  return 0;
  return 1;
}
Yes, this one looks ok (I'm tired, so I may miss something). There is room for improvement as far as performance is concerned, but probably that is not important at this stage.
 

Similar threads

Replies
12
Views
2K
Replies
3
Views
1K
Replies
3
Views
1K
Replies
4
Views
1K
Replies
12
Views
2K
Replies
4
Views
2K
Replies
1
Views
10K
Back
Top