Scrivere un programma C che legga un intero positivo e visualizzi un
messaggio per indicare se il numero è primo.
Il programma deve contenere due funzioni:
Funzione pari()
Specifica: se N è divisibile per 2 restuisci 1, altrimenti restituisci 0.
Codifica:
int pari(int n)
{
if (n%2 == 0) return 1; /* se il resto della divisione e'
0 ... */
else return 0;
}
Ma il C permette anche di utilizzare una scrittura sintetica (e poco leggibile!):
int pari(int n){return !(n%2);}
Funzione primo()
Specifica di I livello: occorre provare a dividere N per tutti i numeri K <= [sqrt(N)]: se nessuno risulta essere un divisore, allora N è primo (con [.] si è indicata la parte intera).
Specifica di II livello:
int primo(int n) {
int max,i;
if (n>=1 && n<=3) return 1;
/* 1,2,3 ? ok */
if (pari(n)) return 0; /* no numeri pari
*/
max = sqrt(n);
for(i=3; i<=max; i+=2)
if (n%i==0) return 0;
return 1;
}
Ed infine il main:
main()
{
int n,i;
printf("n = ");
scanf("%d",&n);
if (primo(n)) printf("Il numero %d e' primo\n",n);
else printf("Il numero %d non e' primo\n",n);
}
Ricordarsi di inserire le due direttive #include <stdio.h> e #include <math.h>
Soluzione (versione tail-ricorsiva)
Si utilizza una funzione di interfaccia int sumtail(int) che provvede a chiamare la funzione tail-ricorsiva inizializzando correttamente i parametri.
int sumtail2(int n, int v, int k)
{
if (k<=n)
{
v = v + k;
k++;
sumtail2(n,v,k);
}
else return v;
}
int sumtail(int n){return sumtail2(n,0,1);}
Soluzione: funzione ricorsiva
Caso generale: x * y = (x - 1) * y + y
Caso base: 0*y = 0
Codifica:
int prod(int x, int y)
{
if (x>0) return y+prod(x-1,y);
else return 0;
}
Soluzione: funzione tail-ricorsiva
Anche in questo caso si utilizza una funzione di interfaccia.
int prod_tail2(int x,int y,int v,int k)
{
if (k<=x)
{
v = v + y;
k++;
return prod_tail2(x,y,v,k);
}
return v;
}
int prod_tail(int x,int y){ return prod_tail2(x,y,0,1);}