Информация об изменениях

Сообщение Re: двоично-десятичные палиндромы от 16.12.2015 15:46

Изменено 16.12.2015 15:48 T4r4sB

работает быстро, но только до миллиарда

  Скрытый текст
#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;
}
Re: двоично-десятичные палиндромы
работает быстро, но только до миллиарда

  Скрытый текст
#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