Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <time.h>
- int *createMatrix(int **p, int n); //행열의 공간을 할당한 후 주소를 RETURN하는 함수
- void input(int **p, int n); //행열의 값을 입력받음
- void main()
- {
- int n; //행과 열을 결정할 변수 n 선언
- int **pA = NULL, **pB = NULL, **pAB = NULL; //A행렬, B행렬, 벡터의 곱을 저장할 포인터 선언
- int **pDiagnol = NULL;
- int i, j; //반복문에 사용할 i, j
- int col, low; //행, 열 변수 선언
- int sum = 0; //대각선의 합
- scanf("%d", &n); //변수 n 입력받음
- pA = (int **)malloc(n * sizeof(int *));
- pB = (int **)malloc(n * sizeof(int *)); //N개만큼의 행을 가지는
- pAB = (int **)calloc(n, sizeof(int *)); //공간을 각 변수에 할당
- if (pA == NULL || pB == NULL || pAB == NULL) {
- printf("Not Enough Memory!\n");
- return;
- }
- createMatrix(pA, n);
- createMatrix(pB, n); //각 주소와 n을 인자로
- createMatrix(pAB, n); //함수를 호출하고 N개 만큼의 열의 공간을 할당시킴
- input(pA, n);
- input(pB, n); //각 행열에 값을 입력해줌
- col = 0;
- low = 0; // col, low를 0으로 초기화
- for (i = 0; i < n * n; i++) { // n * n개의 행렬
- for (j = 0; j < n; j++) { //j를 곱하고자 하는 값을 찾는데 사용
- pAB[col][low] += (pA[col][j] * pB[j][low]); //행렬 곱셈 규칙을 이용해 해당하는 행렬에 값을 대입
- }
- low++; // 한 원소를 구한 후 열 증가
- if (low == n) { //열의 수와 행의 수가 같을 경우
- low = 0; //열을 0으로 초기화 후
- col++; //행 증가
- }
- }
- /*
- for (i = 0; i < n; i++) {
- for (j = 0; j < n; j++) { // n * n개 만큼의
- printf("%d ", pVector[i][j]); // 행렬값을 출력함
- }
- printf("\n"); //한 행을 출력한 후 줄바꿈
- }
- */
- pDiagnol = (int **)malloc(2 * sizeof(int *)); //두 열을 할당
- createMatrix(pDiagnol, n); //각 열에 공간 할당
- for (i = 0; i < n; i++) { //대각선으로 첫번째, 두번째 열에 저장
- pDiagnol[0][i] = pAB[i][i];
- pDiagnol[1][i] = pAB[i][n - 1 - i];
- sum += pDiagnol[0][i] - pDiagnol[1][i]; //각 대각선끼리의 합
- }
- for (i = 0; i < 2; i++) {
- for (j = 0; j < n; j++) {
- printf("%d ", pDiagnol[i][j]);
- }
- printf("\n");
- }
- printf("%d\n", sum);
- for (i = 0; i < n; i++) {
- free(pA[i]), free(pB[i]), free(pAB[i]); //각 행렬의 열 메모리 해제
- }
- free(pA), free(pB), free(pAB); //각 행 메모리 해체
- for (i = 0; i < 2; i++) {
- free(pDiagnol[i]); //각 대각선 행렬의 열 메모리 해제
- }
- free(pDiagnol); //대각선 행렬의 행 메모리 해제
- }
- int *createMatrix(int **p, int n)
- {
- int i; //반복문에 사용할 i
- for (i = 0; i < n; i++) {
- p[i] = (int *)calloc(n, sizeof(int)); //각 배열의 공간 할당과 동시에 0으로 초기화
- }
- return p; //주소값 return
- }
- void input(int **p, int n)
- {
- int i, j; // 반복문에 사용할 i, j
- for (i = 0; i < n; i++) {
- for (j = 0; j < n; j++) { //각 행렬에
- scanf("%d", &p[i][j]); //값을 입력해줌
- }
- }
- }
Add Comment
Please, Sign In to add comment