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