Заполнение динамической матрицы простыми числами по спирали из центра - 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
освобождаются выделенные для матрицы памяти, чтобы избежать утечки памяти.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д