Определить, является ли матрица магическим квадратом - C (СИ)
Формулировка задачи:
Дана матрица
A(n*n) целых чисел, составленная из чисел 1 , 2 , . . . n2.
Определить, является ли она «магическим квадратом» (т.е. суммы по каждому столбцу, каждой строке и каждой из двух диагоналей равны между собой)
помогите составить код.
Решение задачи: «Определить, является ли матрица магическим квадратом»
textual
Листинг программы
#include <stdio.h>
#define n 9
int main (void)
{
int c, i, k;
int a[n][n];
/* заполняем массив числами, начиная с 1 */
for (c=1, i=0; i<n; i++)
for (k=0; k<n; k++)
a[i][k] = c++;
/* найдем суммы диагоналей */
int s1=0, s2=0; // суммы главной и побочной диагоналей
c = n-1;
for (i=0; i<n; i++)
for (k=0; k<n; k++)
{
if (i == k) s1 += a[i][k]; // сумма главной
if (i+k == c) s2 += a[i][k]; // и побочной диагоналей
}
/* если диагонали не равны, то дальше проверять нет смысла */
if (s1 != s2) {c = 0; goto end;}
c = 1; // если проверка успешна, считаем что квадрат магический
/* проверяем строки и столбцы */
int s3;
for (i=0; i<n; i++)
{
for (s2=s3=k=0; k<n; k++)
{
s2 += a[i][k]; // находим сумму в строке
s3 += a[k][i]; // находим сумму в столбце
}
/* если сумма не равна диагонали, то дальше проверять нет смысла */
if (s2 != s1 || s3 != s1) {c = 0; goto end;}
}
end:
// if (c != 0) square is magical
printf("Square is%s.\n", (c)? " magical" : "n't magical");
return 0;
}
Объяснение кода листинга программы
- Включаем заголовочный файл stdio.h для использования функций ввода-вывода
- Задаем размерность матрицы в 9 строк и 9 столбцов
- Инициализируем переменные c, i, k для использования в циклах
- Заполняем массив a[n][n] числами, начиная с 1
- Находим суммы диагоналей s1 и s2
- Проверяем равенство диагоналей s1 и s2, если они не равны, то дальнейшая проверка не имеет смысла
- Проверяем строки и столбцы матрицы на равенство суммы элементов соответствующей диагонали
- Если сумма элементов строки или столбца не равна соответствующей диагонали, то дальнейшая проверка не имеет смысла
- Выводим сообщение о том, является ли квадрат магическим или нет
- Возвращаем 0, чтобы указать, что программа успешно завершилась