Semi Perfetti

/* Scrivere una funzione che preso in input un numero positivo n stampi 1 se n `e un
numero semi-perfetto, 0 altrimenti.

6, 12, 18, 20, 24, 28, 30, 36, 40...

every multiple of a semiperfect number is semiperfect,
and every number of the form 2^(m)p for a natural number
m and a prime number p such that p < 2^(m + 1) is also semiperfect.*/
/* http://juni0rblog.blogspot.com/ */
/* juni0r87@yahoo.it */

#include
#include

int semiperfetto(int a);
int divisoreprimo(int x);

int main()
{
int x;
scanf("%d", &x);
printf("%d", semiperfetto(x));
return 0;
}

int semiperfetto(int a)
{
int temp=0;
int mtwo=0;
int prime=0;
int i=1;
int j=0;
int k=0;
int v[100]; /* sara' uno spreco di memoria??? */

/* trovo i divisori */
for (i=2; i {
if( a%i == 0)
{
v[j] = i;
j++;
}
}

/* controlla se il numero è multiplo di due */
for(k=0; k {
if (v[k]%2 == 0)
{
mtwo=v[k];
}

temp = divisoreprimo(v[k]);

if (temp != -1)
{
if(temp != 2)
{
if(temp < pow(2, k+1))
{
prime = temp;
}

}
}

if (mtwo != 0 && prime != 0)
{
return 1;
}

}
return 0;
}

/* funzione che controlla se il divisore che gli passo è primo!*/
int divisoreprimo(int x)
{
int j=2;
while (x%j != 0)
{
j++;
}
if (j==x)
return x;
else
return -1;
}

Commenti