Заполнение динамической матрицы простыми числами по спирали из центра - C (СИ)
Формулировка задачи:
Всем привет, такой вопрос, не могу написать код для заполнения динамической матрицы простыми числами по спирали с центра, размерность матрицы должна вводиться с клавиатуры, если можно то хотелось бы с комментартями, тк не могу понять и хотелось бы разобраться
Решение задачи: «Заполнение динамической матрицы простыми числами по спирали из центра»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>
static int k = 2;
int simple(int n)
{
for (int i = 2; i <= (int)sqrt((double)n); i++)
if (n % i == 0)
return 0;
return 1;
}
void next(int **a, const int n, int *i, int *j, int *dir)
{
switch (*dir) {
case 1 : /* right */
if (*i < n-1)
++*i;
if (*j+1 < n && a[*i][*j+1] == 0)
*dir = 2;
break;
case 2 : /* down */
if (*j < n-1)
++*j;
if (*i-1 > 0 && a[*i-1][*j] == 0)
*dir = 3;
break;
case 3 : /* left */
if (*i > 0)
--*i;
if (*j-1 > 0 && a[*i][*j-1] == 0)
*dir = 4;
break;
case 4 : /* up */
if (*j > 0)
--*j;
if (*i+1 < n && a[*i+1][*j] == 0)
*dir = 1;
break;
}
while (!simple(++k));
a[*i][*j] = k;
}
int main(int argc, const char * argv[])
{
int n = 3, i, j, dir = 1, **a;
do {
scanf("%d", &n);
} while (n % 2 == 0);
assert(a = (int**)malloc(n*sizeof(int*)));
for (i=0; i<n; i++)
assert(a[i] = (int*)calloc(n, sizeof(int)));
i = j = n/2;
a[i][j] = k;
while (!(i == n-1 && j == 0))
next(a, n, &i, &j, &dir);
for (j=0; j<n; j++) {
for (i=0; i<n; i++)
printf("%d\t", a[i][j]);
printf("\n");
}
for (i=0; i<n; i++)
free(a[i]);
free(a);
return 0;
}
Объяснение кода листинга программы
В этом коде реализуется алгоритм заполнения динамической матрицы простыми числами по спирали из центра.
- В функции
mainпосле циклаdo-whileвычисляется и сохраняется в переменнойnразмер матрицы, который должен быть нечетным. Затем выполняется проверка на четность, чтобы исключить возможность перехода к следующему числу в последовательности. - В функции
nextреализована логика перемещения по матрице и заполнения ее значениями. В зависимости от текущего направления движения (dir) происходит перемещение по матрице до тех пор, пока не будет найдено свободное поле для числаk. Если такое поле найдено, числоkзаписывается в это поле, а затем увеличивается значениеkи выбирается новое направление движения. - В функции
simpleпроверяется, является ли число простым. Для этого используется простой алгоритм перебора делителей от 2 доsqrt(n). Если делитель найден, функция возвращает 0, иначе возвращается 1. - В цикле
whileв функцииmainпроисходит заполнение матрицы до тех пор, пока не будет заполнена вся матрица. После этого матрица выводится на экран. - В конце функции
mainосвобождаются выделенные для матрицы памяти, чтобы избежать утечки памяти.