Print Highly Prime Numbers in an Input Interval | C Program

Click For Summary

Discussion Overview

The discussion revolves around writing a C program to identify and print highly prime numbers within a specified interval . A highly prime number is defined as a prime number that remains prime when digits are successively removed from the right. Participants explore logic errors in the initial implementation and suggest corrections, focusing on the functions that determine primality and the criteria for highly prime numbers.

Discussion Character

  • Homework-related
  • Technical explanation
  • Debate/contested

Main Points Raised

  • Some participants question the logic in the for loop of the isHighlyPrime function, suggesting it should return 0 immediately if isPrime(temp) returns 0.
  • Others point out that the isPrime function incorrectly identifies certain numbers as prime, specifically mentioning that it considers 4 and 7 incorrectly.
  • A participant proposes a new implementation of the isPrime function that checks divisibility up to p/2, which seems to work for a specified interval.
  • Concerns are raised about the efficiency of the isPrime function and its performance, with suggestions for potential improvements.
  • Some examples are provided where the program incorrectly identifies non-prime numbers as highly prime, indicating ongoing issues with the isPrime function.

Areas of Agreement / Disagreement

Participants express disagreement regarding the correctness of the isPrime function and its implementation. Multiple competing views on how to correctly identify highly prime numbers and improve the program remain unresolved.

Contextual Notes

Limitations in the current implementation include unresolved logic errors in the isPrime function, which affect the identification of highly prime numbers. There are also concerns about the efficiency of the algorithm and its handling of specific cases.

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 ·
Replies
12
Views
3K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 17 ·
Replies
17
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 3 ·
Replies
3
Views
1K
  • · Replies 80 ·
3
Replies
80
Views
10K
  • · Replies 12 ·
Replies
12
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 1 ·
Replies
1
Views
11K
  • · Replies 1 ·
Replies
1
Views
2K