Попросили меня решить ребус вида гол * гол = футбол. Написал решение на 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; }