Умножение матриц большого размера - 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);
Объяснение кода листинга программы
В этом коде создаются и динамически выделяются матрицы.
- Создается массив указателей на матрицы с помощью
matrixes = malloc(sizeof(int**) * NUM_OF_MATRIXES). Если выделение памяти не удалось, программа выводит сообщение об ошибке и завершает работу. - Затем в цикле создаются матрицы. Для каждой матрицы сначала выделяется память под массив указателей на строки с помощью
if ( ! ( matrixes[i] = malloc(sizeof(int*) * SIDE_SIZE) ) ) {. Если выделение памяти не удалось, программа выводит сообщение об ошибке и завершает работу. - Затем для каждой строки в матрице выделяется память под массив целых чисел с помощью
if ( ! ( matrixes[i][j] = malloc(sizeof(int) * SIDE_SIZE) ) ) {. Если выделение памяти не удалось, программа выводит сообщение об ошибке и завершает работу. - После выполнения всех операций с матрицами, в цикле освобождается память, выделенная под матрицы и их строки.
- В конце освобождается память, выделенная под массив указателей на матрицы.