| | |
Recursive prime number f(x)
Please support our C advertiser: Programming Forums - DaniWeb Sister Site
![]() |
I wrote this code that checks whether a number is prime or not. It returns 1 if the number is prime or 0 otherwise. U just look at the bottom of the code...
But againnnnn... i want to know how can i convert the iterative version into a recursive one. Will anyone help me convert this prime checking function into a recursive one?
C Syntax (Toggle Plain Text)
#include<stdio.h> #include<conio.h> #include<assert.h> int is_prime(int n); void main(void) { int n=0; clrscr(); printf("An integer "); scanf("%d",&n); assert(n > 1); n=is_prime(n); if (n==1) printf("\nThe number is prime"); else printf("\nThe number is NOT a prime"); getch(); } int is_prime(int n) { int i; for(i=2;i<n;i++){ if (n%i) continue; else return 0; } return 1; }
But againnnnn... i want to know how can i convert the iterative version into a recursive one. Will anyone help me convert this prime checking function into a recursive one?
Last edited by Asif_NSU; Jun 21st, 2004 at 11:18 am. Reason: none
How about:
int is_prime_helper( int n, int test )
{
if (test < 2) return 1;
if (!(n%test)) return 0;
return is_prime_helper(n,test-1);
}
int is_prime(int n,int p)
{
return is_prime_helper(n,n-1);
}
This is using your existing code as a template for the algorithm. There are better ways of finding tests for primes, though. For example, if you are looking for 123 to see if it is prime, anything more than HALF 123 can't divide into it evenly. so no point checking those. Another thing to realize is that if it isn't divisible by 2 it isn't divisible by ANY even number, so maybe check for 2, then all odd numbers. Gee, but if it isn't divisible by 3 it isn't divisible by 9 or any other multiple of 3. And so on. For the real key to minimal checks, look in Google for "Sieve of Eratosthenes".
int is_prime_helper( int n, int test )
{
if (test < 2) return 1;
if (!(n%test)) return 0;
return is_prime_helper(n,test-1);
}
int is_prime(int n,int p)
{
return is_prime_helper(n,n-1);
}
This is using your existing code as a template for the algorithm. There are better ways of finding tests for primes, though. For example, if you are looking for 123 to see if it is prime, anything more than HALF 123 can't divide into it evenly. so no point checking those. Another thing to realize is that if it isn't divisible by 2 it isn't divisible by ANY even number, so maybe check for 2, then all odd numbers. Gee, but if it isn't divisible by 3 it isn't divisible by 9 or any other multiple of 3. And so on. For the real key to minimal checks, look in Google for "Sieve of Eratosthenes".
•
•
•
•
But againnnnn... i want to know how can i convert the iterative version into a recursive one. Will anyone help me convert this prime checking function into a recursive one?
C Syntax (Toggle Plain Text)
#include<stdio.h> #include<conio.h> #include<assert.h> int is_prime(int n); void main(void) { int n=0; clrscr(); printf("An integer "); scanf("%d",&n); assert(n > 1); n=is_prime(n, 2); if (n==1) printf("\nThe number is prime"); else printf("\nThe number is NOT a prime"); getch(); } int is_prime(int n, int z) { if((n%z)==0) return 1; else { if(z<n) return is_prime(n,z+1); else return 0; } }
•
•
•
•
Originally Posted by Toba
Actually, you only have to go up to the square root of the number. If the number is a square, you'll get it, and if it isn't, you'll get one factor of each possible set, which is enough.
Nice code. 
However, on low-memory systems, this smells like a stack crash (very recursive).
BTW, even if you are just checking for divisibility (ie. num1 % num2 == 0) to determine if a specific number is prime, you only need to check for divisibility up to the square root. Here's a quick snippet of VB code to do this:
This code is untested, but it will work.

However, on low-memory systems, this smells like a stack crash (very recursive).
BTW, even if you are just checking for divisibility (ie. num1 % num2 == 0) to determine if a specific number is prime, you only need to check for divisibility up to the square root. Here's a quick snippet of VB code to do this:
C Syntax (Toggle Plain Text)
Dim n as Integer Dim test as Integer Dim isPrime as Boolean n = val(inputbox("Number to check:") isPrime = false For test = 2 to int(sqr(n)) If n mod test = 0 Then isPrime = true Exit For End If Next test If isPrime Then MsgBox "Number is prime" Else MsgBox "Number is divisible by " & test End If
This code is untested, but it will work.
what? WHAT?
To k-1:
I found that there were a few problems with your code. It returns everything as a prime.
I tried changing ur code to this
I did so , bcos in MY code i actully printed "The number is prime" when the value returned by the func was 1(true); But still it didnt help. For the moment it merely printed "the number is NOT prime" for all cases.
Therefore, the problem that i found was actually in base case of the recursive function. z gets incremented to n and eventually n%n yields to 0; So i just added one more line in the beginning of the function:
I found that there were a few problems with your code. It returns everything as a prime.
I tried changing ur code to this
C Syntax (Toggle Plain Text)
int is_prime(int n, int z) { if((n%z)==0) return 0;//should be 0 else { if(z<n) return is_prime(n,z+1); else return 1;//should be one } }
I did so , bcos in MY code i actully printed "The number is prime" when the value returned by the func was 1(true); But still it didnt help. For the moment it merely printed "the number is NOT prime" for all cases.
Therefore, the problem that i found was actually in base case of the recursive function. z gets incremented to n and eventually n%n yields to 0; So i just added one more line in the beginning of the function:
C Syntax (Toggle Plain Text)
int is_prime(int n, int z) { if(n==z) return 1; else if((n%z)==0) return 0; else if(z<n) return is_prime(n,z+1); }
Last edited by Asif_NSU; Jun 24th, 2004 at 5:59 am. Reason: typo
To Chainsaw:
Thanx, ur code works just fine, but why did u pass two parameters in the is_prime() function. I mean we dont actually need int p, do we?
Thanx, ur code works just fine, but why did u pass two parameters in the is_prime() function. I mean we dont actually need int p, do we?
C Syntax (Toggle Plain Text)
int is_prime(int n,int p)//is p of any use? { return is_prime_helper(n,n-1); }
To Toba:
I think u r right. We only need check upto the squre root of the function.
I converted ur VB code into C code, i checked it and it works fine.
Thanx.
I think u r right. We only need check upto the squre root of the function.
I converted ur VB code into C code, i checked it and it works fine.
Thanx.
C Syntax (Toggle Plain Text)
#include<stdio.h> #include<conio.h> #include<assert.h> #include<math.h> int is_prime(int n) { int test; for(test =2; test <=(int)sqrt(n); test++){ if (n%test!=0) continue; else return 0; } return 1; } void main(void) { int n=0; clrscr(); printf("An integer "); scanf("%d",&n); assert(n > 1); n=is_prime(n); if (n==1) printf("\nThe number is prime"); else printf("\nThe number is NOT a prime"); getch(); }
•
•
•
•
Originally Posted by Asif_NSU
To Chainsaw:
Thanx, ur code works just fine, but why did u pass two parameters in the is_prime() function. I mean we dont actually need int p, do we?C Syntax (Toggle Plain Text)
int is_prime(int n,int p)//is p of any use? { return is_prime_helper(n,n-1); }
How about this (incorporating your fix and the sqrt thingy):
int is_prime(int n)
{
return is_prime_helper(n,(int)sqrt(n));
}
note the cast of the double returned by sqrt into an int. There was a time when sqrt was very costly (on non-floating point machines). Not sure that matters anymore.
![]() |
Similar Threads
Other Threads in the C Forum
- Previous Thread: program help
- Next Thread: Assign content to a function pointer
Views: 15810 | Replies: 12
| Thread Tools | Search this Thread |
Tag cloud for C
#include * .net append array arrays asterisks binarysearch calculate changingto char character cm command copyimagefile cprogramme creafecopyofanytypeoffileinc database directory dynamic execv feet fgets file fork forloop framework function functions givemetehcodez grade graphics gtkwinlinux hacking histogram homework include incrementoperators input intmain() iso kernel keyboard km lazy license linked linkedlist linux list lists locate logical_drives looping loopinsideloop. lowest matrix microsoft mqqueue mysql number oddnumber odf opensource overwrite owf pdf performance pointer pointers posix probleminc process program programming radix recursion recv recvblocked research reversing scanf scripting segmentationfault sequential socket spoonfeeding standard string student systemcall testing threads turboc unix user variable wab whythiscodecausesegmentationfault windowsapi





