Sei sulla pagina 1di 3

#include <stdio.

h>
#include <stdlib.h>
#include <math.h>
struct nodo
{
int info1;
int info2;
struct nodo *successivo;
};
typedef struct nodo Nodo;
typedef Nodo *Puntatore;
int Potenza(int a, int b)
;Puntatore inizializza ();
Puntatore inserisci_in_testa(Puntatore o, int nuovo1, int nuovo2);
void stampalista(Puntatore o);
Puntatore elimina_tutti(Puntatore o, int eliminandus);
void stampalista(Puntatore o)
{
while (o!=NULL)
{
printf("%6d%6d\n", o->info1, o->info2);
o=o->successivo;
}
}
Puntatore inserisci_in_testa(Puntatore o, int nuovo1, int nuovo2)
{
Puntatore p,a;
p=malloc(sizeof(Nodo));
a=p;
p->info1=nuovo1;
p->info2=nuovo2;
p->successivo=o;
return a;
}
Puntatore inizializza ()
{
return NULL;
}
int Potenza(int a, int b)
{
if (b==0)
return 1; //lo so che sto dicendo che 0^0=1 ma nell'algoritmo in questione
non ha importanza
return a*Potenza(a, b-1);
}
int main()
{
long int x, i, j,ka, kb, kc, t, k;
Puntatore candidati, o, p=NULL, q;
candidati=inizializza();
printf("Signore, digiti un numero compreso tra 0 e 32767 e il computer lo
fattorizzerà!\n");
scanf("%ld", &x);
for ( j = 1; j < 10; j++)
{
for ( k = 1; k< 10; k++)
{
if( ((j*k)%10)==(x%10) )
{
candidati=inserisci_in_testa(candidati, j, k);
}
}
}
for ( i = 1; i < log10(x); i++)
{
o=candidati;
q=candidati;
while (o!=p)
{
t=0;
for ( kb = 0; kb < 10; kb++)
{
for(ka = 0; ka < 10; ka++)
{
if ((( (o->info1+Potenza(10,i)*ka) * (o-
>info2+Potenza(10,i)*kb) )%Potenza(10,i+1))==(x%(Potenza(10,i+1))))
{
candidati=inserisci_in_testa(candidati,o-
>info1+Potenza(10,i)*ka, o->info2+Potenza(10,i)*kb);
}

}
}
o->info1=0;
o->info2=0;
o=o->successivo;
}
p=q;
}
o=candidati;
while (o!=NULL)
{
if (o->info1*o->info2!=x)
{
o->info1=0;
o->info2=0;
}
o=o->successivo;
}
candidati=elimina_tutti(candidati, 0);
putchar('\n');
stampalista(candidati);
main();
}
Puntatore elimina_tutti(Puntatore o, int eliminandus)
{
Puntatore a=0, p=0,t=0;
while (o!=NULL && o->info1==eliminandus)
{
p=o;
o=o->successivo;
free(p);
}
if (o==NULL)
{
return NULL;
}
else
{
a=o;
p=o;
o=o->successivo;
while(o!=NULL)
{
if(o->info1==eliminandus)
{
t=o;
p->successivo=o->successivo;
o=o->successivo;
free(t);
}
else
{
p=o;
o=o->successivo;
}
}
return a;
}
}