Решение ребуса: гол * гол = футбол

Попросили меня решить ребус вида гол * гол = футбол. Написал решение на C. Зачем это здесь? Просто я давно ничего не постил в блог, надо немного освежить содержимое. Ну и это может быть полезным для тех, кто ещё только изучает C :). Код прокомментирован на русском языке.
Всё достаточно просто:

/*
 
    Решение маски abc * abc = defbc (ребус: гол * гол = футбол)
 
*/
 
#include <stdio.h>
#include <math.h>
 
#define SIZE_A  3
#define SIZE_B  5
 
int main()
{
    int num = 0, i, j, n, a[SIZE_A], b[SIZE_B];
 
    for (n = 100; n <= 999; n++) {
        num = n;
 
        // записываем цифры числа num в массив
        a[0] = num % 10;
        a[1] = num / 10 % 10;
        a[2] = num / 100;
 
        // проверяем эквивалентность цифр в числе a
        if (a[0] == a[1] || a[0] == a[2] || a[1] == a[2]) {
            continue;
        }
 
        num *= num;
 
        if (num > 99999) {
            continue;
        }
        // записываем цифры числа num в массив
        b[0] = num % 10;
        b[1] = num / 10 % 10;
 
        // проверяем идентичность двух последних цифр в числе
        if (b[0] != a[0] || b[1] != a[1]) {
            continue;
        }
        b[2] = num / 100 % 10;
        b[3] = num / 1000 % 10;
        b[4] = num / 10000;
 
        // проверяем эквивалентность цифр в числе b
        for (i = 0; i < SIZE_B; i++) {
            for (j = i+1; j < SIZE_B; j++) {
                // если нашлись какие-нибудь одинаковые значения, то прерываем цикл
                if (b[i] == b[j]) {
                    num = 0;
                    break;
                }
            }
        }
 
        // проверяем эквивалентность цифр в числах a и b
        for (i = 0; i < SIZE_A; i++) {
            for (j = 0; j < SIZE_B; j++) {
                // игнорируем значения, которые должны быть равными
                if ((i == 0 && j == 0) || (i == 1 && j == 1)) {
                    continue;
                }
 
                // если нашлись какие-нибудь одинаковые значения, то прерываем цикл
                if (a[i] == b[j]) {
                    num = 0;
                    break;
                }
            }
        }
 
        // вывод результата
        if (num != 0) {
            num = sqrt(num);
            printf("%d * %d = %d\n", num, num, num*num);
        }
    }
    return 0;
}
Перейти к верхней панели