Primo ricorsivo

« Older   Newer »
 
  Share  
.
  1. †Axel
     
    .

    User deleted


    QUOTE
    Verificare se un numero è primo utilizzando una funzione ricorsiva

    La mia soluzione
    SPOILER (click to view)
    CODE
    #include <iostream>

    using namespace std ;

    bool primo ( int i , int n ) {

           if ( i == 1 ) return true ;
           if ( n % i == 0 ) return false ;

           primo( --i , n ) ;

    }

    int main ( int argc , char** argv ) {

           int i=0 , n ;

           cin >> n ;
           if ( primo( n/2 , n ) ) cout << "Numero primo" << endl ;

           else cout << "Numero non primo" << endl ;

           return 0 ;

    }
     
    Top
    .
  2. Alchimist
     
    .

    User deleted


    C - Code
    CODICE
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>

    int max, num;
    int *start, *primes;

    int prime(int i) {
     if(num%­primes[i] == 0)
       return 0;
     if(i<max)
       prime(++i);
     return 1;
    }

    int main(void) {
     int i, j;

     printf("Insert the number: ");
     scanf("%d", &num);

     if(num < 2) {
       printf("You must insert a number greater than 1.");
       return -1;
     } else if(num == 2) {
       printf("%d is prime.", num);
       return 0;
     } else if(num%2 == 0) {
       printf("%d is NOT prime.", num);
       return 1;
     }

     max = ((int)(sqrt(num)-0.5)%2 == 0) ? (int)(sqrt(num)-0.5)/2 : ((int)(sqrt(num)-0.5)-1)/2;
     start = calloc(max, sizeof(int));
     for(i=0; i<max; i++)
       start[i] = (i*2)+3;

     for(i=0; i<max; i++) {
       if(start[i] == 0)
         continue;
       for(j=(i+1); j<max; j++)
         if(start[j] != 0 && start[j]%­start[i] == 0)
           start[j] = 0;
     }

     for(i=0, j=0; i<max; i++)
       if(start[i] != 0) {
         primes = realloc(primes, j+1);
         primes[j++] = start[i];
       }

     if(prime(0))
       printf("%d is prime.", num);
     else
       printf("%d is NOT prime.", num);

     free(start);
     free(primes);
     return 0;
    }
     
    Top
    .
  3.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Dovrebbe essere corretto.

    Java
    CODICE
    class Primo {
     boolean isPrime(int n) {
       if(n%2 == 0) return false;
       return isPrime(n,3);
     }
     
     private boolean isPrime(int n, int i) {
       if((n%­i == 0) && (n!=i)) return false;
       else if((n%­i == 0) && (n==i)) return true;
       else return isPrime(n,i+=2);
       
     }
    }

    class TestPrimo {
     public static void main(String[] args) {
       Primo p = new Primo();
       System.out.println(p.isPrime(33));
     }
    }
     
    Top
    .
  4. †Axel
     
    .

    User deleted


    Scheme : http://sprunge.us/befS?scm
     
    Top
    .
  5. Guglielmoqwerty
     
    .

    User deleted


    Ed infine la mia :) (conoscete un algoritmo più veloce di quello con la radice quadrata?)
    CODICE
    public boolean isPrimo(int n)
    {
           if(sqrt(n)%1==0.0D) { return false; } //Controllo se è un quadrato (e se è 1)
           if(n==0) {return false;}
           
           n = sqrt(abs(n));
           int divisore=2;
           while(numero%divisore!=0)
           {
                   divisore++;
           }
           return(numero!=divisore);
    }
     
    Top
    .
  6.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Potresti scorrere solo i numeri dispari, e non quelli pari.
     
    Top
    .
  7. Guglielmoqwerty
     
    .

    User deleted


    Giusto, non ci avevo pensato :)
     
    Top
    .
6 replies since 4/8/2012, 22:37   1477 views
  Share  
.