/* 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;
}
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
Posta un commento