Умножение матриц большого размера - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Как объявить матрицу из целых чисел размера NxN если это N <=1024? Нужно написать умножение матриц и посчитать сколько элементов из полученной матрицы делятся на вводимое вместе с N d. Но при компиляции будет выдавать ошибку, так какN слишком большое( Для размеров меньше 300 все идеально
#include <stdio.h>
#include <stdlib.h>
 
int nod (int a, int b)
{
    if (b == 0)
        return a;
    else
        return nod (b, a % b);
}
 
int main()
{
int i,j,n,k,z=0;
long long int a[512][512],b[512][512],d;
 
scanf("%d %d", &n, &d);
for( i = 1; i <= n; i++)
  for( j = 1; j <= n; j++)
    {a[i][j]=nod(i+1, j+1);
 b[i][j]=nod(n-i+1, n-j+1);}

i=1;
while (i<=n)
{  j=1;
while (j<=n)
  {b[i][j]=0;
    k=1;
     while (k<=n)
  {b[i][j]+=a[i][k]*b[j][k]; k++;    }
 
    if (b[i][j]%d==0) z++;
    j++;}
    i++;
}
printf("%d",z);
 
return 0;
 
}

Решение задачи: «Умножение матриц большого размера»

textual
Листинг программы
#define NUM_OF_MATRIXES (3)
#define SIDE_SIZE (1024)
/*...*/
int *** matrixes, i, j, k;
if ( ! ( matrixes = malloc(sizeof(int**) * NUM_OF_MATRIXES) ) ) {
    perror("malloc");
    exit(1);
}
for ( i = 0; i < NUM_OF_MATRIXES; ++i ) {
    if ( ! ( matrixes[i] = malloc(sizeof(int*) * SIDE_SIZE) ) ) {
        perror("malloc");
        exit(1);
    }
    for ( j = 0; j < SIDE_SIZE; ++j ) {
        if ( ! ( matrixes[i][j] = malloc(sizeof(int) * SIDE_SIZE) ) ) {
            perror("malloc");
            exit(1);
        }
    }
}
/*...*/
for( i = 0; i < NUM_OF_MATRIXES; ++i )
    for ( j = 0; j < SIDE_SIZE; ++j )
        for ( k = 0; k < SIDE_SIZE; ++k )
            /* сделать что-то с matrixes[i][j][k] */
/*...*/
for ( i = 0; i < NUM_OF_MATRIXES; ++i ) {
    for ( j = 0; j < SIDE_SIZE; ++j )
        free(matrixes[i][j]);
    free(matrixes[i]);
}
free(matrixes);

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

В этом коде создаются и динамически выделяются матрицы.

  1. Создается массив указателей на матрицы с помощью matrixes = malloc(sizeof(int**) * NUM_OF_MATRIXES). Если выделение памяти не удалось, программа выводит сообщение об ошибке и завершает работу.
  2. Затем в цикле создаются матрицы. Для каждой матрицы сначала выделяется память под массив указателей на строки с помощью if ( ! ( matrixes[i] = malloc(sizeof(int*) * SIDE_SIZE) ) ) {. Если выделение памяти не удалось, программа выводит сообщение об ошибке и завершает работу.
  3. Затем для каждой строки в матрице выделяется память под массив целых чисел с помощью if ( ! ( matrixes[i][j] = malloc(sizeof(int) * SIDE_SIZE) ) ) {. Если выделение памяти не удалось, программа выводит сообщение об ошибке и завершает работу.
  4. После выполнения всех операций с матрицами, в цикле освобождается память, выделенная под матрицы и их строки.
  5. В конце освобождается память, выделенная под массив указателей на матрицы.

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


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

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

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