Lo modifico de forma que también encuentre otros colmillos si es que existen:
Código C++:
Ver original#include <stdio.h>
#include <math.h>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
int dec[5] = {1, 10, 100, 1000, 10000};
int cant(int num, int t)
{
if (num) t += 1 << (num%10) * 6, cant(num / 10, t);
else return t;
}
int comprobar(int min, int max, int num, int b, int t, int es)
{
if(min <= max)
{
b = num / min;
if (min * b == num && ((min % 10) || (b%10))
&& t == cant(min, 0) + cant(b, 0) )
printf("%d = %d x %d\n", num
, min
, b
), es
++; comprobar(min + 1, max, num, b, t, es);
}else return es > 0 ? 1 : 0;
}
int es_vampiro(int num)
{
int min
, max
, b
= 0, nd
= log10(num
) + 1, t
= cant
(num
, 0); if (nd % 2) return 0;
nd /= 2;
min = MAX(dec[nd - 1], (num + dec[nd] - 2)/(dec[nd] - 1));
max
= MIN
(num
/min
, sqrt(num
)); return comprobar(min, max, num, b, t, 0);
}
int main(void)
{
printf("\n<%d>\n", es_vampiro
(13078260)); return(0);
}
Saludos