Игорь Пашев - Post a comment

Nov. 30th, 2008

[info]igorpashev

01:43 am - Re: Арифметика для взрослых

http://lj.rossia.org/users/neklyueva/686169.html


#include <stdio.h>
#include <malloc.h>
#include <string.h>

unsigned int N = 1;
unsigned int t = 0;
unsigned int b = 3; /* основание */
unsigned int i;
char*        str;
const char   digits[] =
    {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};


/* a^n */
unsigned int upow(unsigned int a, unsigned int n)
{
    unsigned int i, r = 1;
    for (i = 0; i < n; i++) r *= a;
    return r;
}

/* buf - куда поместить строку, N - число разрядов,
base - основание системы, u - исходное число */
void uint2str(char* buf, unsigned int N, unsigned int base, unsigned int u)
{
    unsigned int i;
    for (i = 1; i <= N; i++)
    {
        buf[N-i] = digits[u % base];
        u /= base;
    }
}

int main(int argc, char **argv)
{
    if (argc > 1) sscanf(argv[argc - 1], "%u", &N);
    str = malloc(sizeof(char)*(N + 1));
    str[N + 1] = '\0';

    for (i = 0; i < upow(b, N); i++)
    {
        uint2str(str, N, b, i);
        if (!strstr(str, "22"))
        {
            printf("%s = %u\n", str, i);
            t++;
        }
    }

    free(str);
    printf("N = %u, t = %u\n", N, t);
    return 0;
}


Для N=4, например
0000 = 0
0001 = 1
0010 = 2
0100 = 4
0101 = 5
1000 = 8
1001 = 9
1010 = 10
N = 4, t = 8

Read Comments

Reply:

From:
(will be screened)
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Username:
Password:
Subject:
No HTML allowed in subject
Message: