Informatika gyűjtemény

Egy szinttel feljebb szamjegy.cpp

2004050607080910

NézetNyomtat

szamjegy.cpp (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>

#define IFile "szamjegy.be"
#define OFile "szamjegy.ki"

#define MDIG 10
#define MLEN 12
#define MNUM 11
#define MINL 256

/*
    This program solves additions with letter. Eg.:
    Input:  USA+USSR=PEACE
    Output: 362+3668=10270
    This program was created by Janos M. Uray on 30th September 2008.
*/

int NDig = 0, Num = 0;
int A[MDIG];
int B[MNUM][MLEN];
int Len[MNUM];
char bNewCase;
FILE * IN, * OUT;

void Init (void);
int Exam (void);
void Print (void);
int Next (void);

int main (void) {
    printf("<-- Start -->\n");

    Init();
    OUT = fopen(OFile, "w");
    if (OUT == NULL) {
        printf("Output file error.\n");
        return 1;
    }
    if (IN == NULL) {
        printf("Input file error.\n");
        return 1;
    }
    do
        if (Exam())
            Print();
    while (Next());
    fclose(OUT);
    return 0;
}

void Init (void) {
    char C[MDIG];
    int I, J, L;
    char X;

    IN = fopen(IFile, "r+b");
    if (IN == NULL)
        return;
    fseek(IN, 0, SEEK_END);
    L = ftell(IN);
    Len[Num] = 0;
    for (= 0; I < MNUM; I++)
        for (= 0; J < MLEN; J++)
            B[I][J] = -1;
    for (= L - 1; I >= 0; I--) {
        fseek(IN, I, SEEK_SET);
        fread(&X, 1, 1, IN);
        if (== '+' || X == '=') {
            Num++;
            Len[Num] = 0;
        } else {
            for (= 0; J < NDig; J++)
                if (C[J] == X)
                    break;
            if (== NDig)
                C[NDig++] = X;
            B[Num][Len[Num]++] = J;
        }
    }
    Num++;
    fclose(IN);

    for (= 0; I < MDIG; I++)
        A[I] = I;
}

int Exam (void) {
    int I, J, X = 0;

    if (!bNewCase)
        return 0;
    for (= 0; I < Num; I++)
        if (A[B[I][Len[I] - 1]] == 0)
            return 0;

    for (= 0; I < MLEN; I++) {
        for (= 1; J < Num; J++)
            if (B[J][I] != -1)
                X+= A[B[J][I]];
        if (B[0][I] != -1)
            if (X%10 != A[B[0][I]])
                return 0;
        X/= 10;
    }
    return 1;
}
void Print (void) {
    int I, J;

    for (= Num - 1; I >= 0; I--) {
        for (= Len[I] - 1; J >= 0; J--)
            fprintf(OUT, "%d", A[B[I][J]]);
        if (== 0)
            fprintf(OUT, "\n");
        else if (== 1)
            fprintf(OUT, "=");
        else
            fprintf(OUT, "+");
    }
}

int Next (void) {
    int X, Y, I, J, Min;

    for (= MDIG - 2; X >= 0 && A[+ 1] <= A[X]; X--);
    if (== -1)
        return 0;
    Y = X + 1;
    Min = A[Y];
    for (= X + 2; I < MDIG; I++)
        if (A[I] <= Min && A[I] > A[X]) {
            Y = I;
            Min = A[Y];
        }
    bNewCase = Y < NDig || X < NDig;
    A[Y] = A[X];
    A[X] = Min;
    for (= X + 1, J = MDIG - 1; I < J; I++, J--) {
        Min = A[I];
        A[I] = A[J];
        A[J] = Min;
    }
    return 1;
}

(Vissza)