Заполнение динамической матрицы простыми числами по спирали из центра - 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;
}

Объяснение кода листинга программы

В этом коде реализуется алгоритм заполнения динамической матрицы простыми числами по спирали из центра.

  1. В функции main после цикла do-while вычисляется и сохраняется в переменной n размер матрицы, который должен быть нечетным. Затем выполняется проверка на четность, чтобы исключить возможность перехода к следующему числу в последовательности.
  2. В функции next реализована логика перемещения по матрице и заполнения ее значениями. В зависимости от текущего направления движения (dir) происходит перемещение по матрице до тех пор, пока не будет найдено свободное поле для числа k. Если такое поле найдено, число k записывается в это поле, а затем увеличивается значение k и выбирается новое направление движения.
  3. В функции simple проверяется, является ли число простым. Для этого используется простой алгоритм перебора делителей от 2 до sqrt(n). Если делитель найден, функция возвращает 0, иначе возвращается 1.
  4. В цикле while в функции main происходит заполнение матрицы до тех пор, пока не будет заполнена вся матрица. После этого матрица выводится на экран.
  5. В конце функции main освобождаются выделенные для матрицы памяти, чтобы избежать утечки памяти.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы