Informatika gyűjtemény

Egy szinttel feljebb mb_abcode.c

2004050607080910

NézetNyomtat

mb_abcode.c (Vissza)
Az alábbi letöltési lehetőségek közül választhatsz: (segítség)
Karakterkódolás:
Sortörés:
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 2 KB
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#ifdef REKURZIV
static int m;

void brutalis_rekurzio(char *buf, size_t len)
{
    if (len == 0) {
        m++;
        return;
    }

    /* ha 2 mulva nulla lesz, akkor az aktualisat nem kezelhetjuk ket
     * szamjegykent */
    if (len > 2 && buf[2] == 0) {
        brutalis_rekurzio(buf + 1, len - 1);
        return;
    }

    if (len > 1 && buf[1] == 0) {
        /* ha 1 mulva 0 van, az aktualis pedig 2-nagyobb (26 szam
         * van az angol abc-ben) */
        if (*buf > 2)
            printf("hibas bemenet!!!\n");

        brutalis_rekurzio(buf + 2, len - 2);
        return;
    }

    /* egy szamjegy hosszunak mindenkeppen kezelhetjuk */
    brutalis_rekurzio(buf + 1, len - 1);

    if (len > 1) {
        /* ha ket szamjegykent is kezelhetjuk,
         * akkor ket szamjegykent is kezeljuk*/
        if (*buf == 1 || (*buf == 2 && buf[1] <= 6))
            brutalis_rekurzio(buf + 2, len - 2);
    }
}
#else
size_t mar_nem_brutalis_nem_rekurzio(char *buf, size_t len)
{
    size_t a = 1, b = 1, c, i;

    for (= 1; i < len; i++) {
        if (buf[i] == 0) {
            c = a;
        } else if (buf[- 1] == 1 ||
               (buf[- 1] == 2 && buf[i] <= 6)) {
            c = a + b;
        } else {
            c = b;
        }

        a = b;
        b = c;
    }

    return b;
}
#endif

void parse(char *buf)
{
    char *b;
    size_t len = 0;

    b = buf;
    while (*b) {
        if (!isdigit(*b) && *!= '\n') {
            fprintf(stderr, "Rossz szoveg\n");
            return;
        }

        if (*== '\n')
            break;

        *-= '0';

        b++;
        len++;
    }

#ifdef REKURZIV
    m = 0;
    brutalis_rekurzio(buf, len);
    printf("megoldas: %d\n", m);
#else
    printf("megoldas: %u\n", mar_nem_brutalis_nem_rekurzio(buf, len));
#endif
}

int main(int argc, char **argv)
{
    char buffer[1024], *buf = 0, *new;
    size_t len = 0, l = 0;

    while (fgets(buffer, 1024, stdin)) {
        l += strlen(buffer) + 1;

        if (> len) {
            new = realloc(buf, l * sizeof(char));
            if (!new) {
                perror("realloc");
                free(buf);
                return 1;
            }

            if (!buf)
                *new = '\0';

            len = l;

            buf = new;
        }

        strcat(buf, buffer);

        if (strchr(buffer, '\n')) {
            parse(buf);
            l = 0;
            *buf = '\0';
        }
    }

    if (buf)
        free(buf);

    return 0;
}
(Vissza)