работает быстро, но только до миллиарда
| Скрытый текст |
| #include "stdio.h"
int Log2n(uint32_t n)
{
int result = 0;
if (n>=(1<<16)) { n>>=16; result+=16; }
if (n>=(1<< 8)) { n>>= 8; result+= 8; }
if (n>=(1<< 4)) { n>>= 4; result+= 4; }
if (n>=(1<< 2)) { n>>= 2; result+= 2; }
if (n>=(1<< 1)) { n>>= 1; result+= 1; }
return result;
}
bool Pan2(uint32_t n)
{
int ord = Log2n(n);
for (int i=0,j=ord; i<j; ++i, --j)
if (((n>>i)^(n>>j))&1)
return false;
return true;
}
void EnumPan10(int digits)
{
int counters[16];
counters[0]=1;
for (int i=1; i<(digits+1)/2; ++i)
counters[i]=0;
int adds[16];
for (int i=0; i<digits; ++i)
adds[i]=0;
int n=1;
for (int i=0, j=digits-1; i<digits; ++i, --j)
{
adds[i<j?i:j] += n;
n *= 10;
}
for (;;)
{
int cd=0;
for (;;)
{
++counters[cd];
if (counters[cd]<=9)
break;
if (cd>=digits-cd-2)
return;
counters[cd]=0;
++cd;
}
if (counters[0]==0)
continue;
uint32_t res=0;
for (int i=0; i<(digits+1)/2; ++i)
res += counters[i]*adds[i];
if (Pan2(res))
printf("%i ", res);
}
}
int main ()
{
for (int i=1; i<=9; ++i)
EnumPan10(i);
getchar();
return 0;
}
|
| |
вывод
| Скрытый текст |
| 3 5 7 9 33 99 313 717 585 9009 7447 32223 53235 15351 73737 53835 39993 585585 5841485 5071705 1934391 1758571 3129213 5259525 1979791 13500531 719848917 910373019 939474939 |
| |
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте