전산수학 – matrix*n.c (행렬의 거듭 제곱)

행렬의 거듭 제곱 c언어 소스

0. 행렬로 사용할 2차원 배열을 만듬 < 구조체로 만듬 >

0-2. 구조체 변수를 여러 개 만들고 m변수는 A행렬로 사용, t1,t2변수는 거듭제곱할 때 사용

1. 사용자로부터 정방행렬(a*a)에서 a를 입력받음

2. 각 행의 요소들을 정수형으로 입력받음

3. 문자열이 저장된 배열을 인덱스로 나누어서 m변수에 넣음 (a*a행렬 완성)

4. n을 입력받음

For(int s=1; s<=n; s++)

{

5. s가 1이 오면 m변수를 t1변수로 대체

6. s가 2가 오면 m(a*a)*m(a*a)을 해서 t1변수에 저장 => t1=A^2행렬

7. s가 3이상이면 t1*m(A)를 해서 t2변수에 저장. t2변수를 t1변수로 대체

}

8. m(정방행렬) 및 t1(거듭제곱된 최종 행렬)을 출력

#include <stdio.h>
#define max 10
typedef struct {
	int array[max][max]; // 행렬을 나타내는 2차원 배열 
}matrix_type;

matrix_type m, t1, t2;

void square(int n, int a) {

	int sum;
	for (int s = 1; s <= n; s++) {
		switch (s) {
		case 1: // 사용자가 n을 1 입력한 경우 (거듭제곱 x)
			t1 = m; // m행렬을 t1행렬로 처리 
			break;

		case 2: // 사용자가 n을 2 입력한 경우 (거듭제곱 한 번)
			for (int i = 0; i < a; i++) {
				for (int j = 0; j < a; j++) {
					sum = 0;
					for (int h = 0; h < a; h++) {
						sum += m.array[i][h] * m.array[h][j];
					}
					t1.array[i][j] = sum;
				}
			}
			break;

		default: // 사용자가 n을 3이상 입력한 경우 (거듭제곱 두 번 이상)
			for (int i = 0; i < a; i++) {
				for (int j = 0; j < a; j++) {
					sum = 0;
					for (int h = 0; h < a; h++) {
						sum += t1.array[i][h] * m.array[h][j];
					}
					t2.array[i][j] = sum;
				}
			}
			t1 = t2; // t2행렬을 t1행렬로 처리 
			break;

		}
	}
}

void input_processing(int a) {

	for (int i = 0; i < a; i++) {
		printf("○ %d행의 요소를 입력하세요:", i + 1);
		for (int j = 0; j < a; j++) 
			scanf_s("%d", &m.array[i][j]);
	}
	// scanf는 띄어쓰기가 들어가면 (저장 후) 멈춤 -> 다시 for문으로 감 (a회 반복)
}

void display(int situation, int *a, int *n) {
	switch (situation) {
	case 0:
		printf("<< 문제 >>\n\n");
		printf("정방형 행렬 A와 양의 정수 n이 주어졌을 때, A^n을 구하라\n\n");
		printf("1. A(a*a)행렬에서 a 값을 입력해주세요\n < ex) 2*2행렬을 하고 싶으면 -> 2 > :");
		scanf_s("%d", a);
		printf("\nA(a*a)행렬은 %d*%d행렬입니다!!", *a, *a);
		printf("\n%d열만큼 요소를 입력해주세요!! < ex) 3열인 행렬이면 1 2 3 >\n\n", *a);
		break;

	case 1:
		printf("\n2. 정수 n 값을 입력해주세요 :");
		scanf_s("%d", n);
		break;

	case 2:
		printf("\n\n<< 정답 >>\n");

		printf("\nA행렬 (a*a)을 구하면 ↓↓ \n\n");
		for (int i = 0; i < *a; i++) {
			for (int j = 0; j < *a; j++)
				printf("%d ", m.array[i][j]);
			printf("\n");
		}
		printf("\nA^n을 구하면 ↓↓ \n\n");
		for (int i = 0; i < *a; i++) {
			for (int j = 0; j < *a; j++)
				printf("%d ", t1.array[i][j]);
			printf("\n");
		}
		break;
	}
}

int main(void) {
	int a, n;

	// a*a 행렬 구하기
	display(0, &a, &n);

	// a*a 요소 입력 처리
	input_processing(a);

	// n 구하기
	display(1, &a, &n);

	// 행렬의 거듭제곱 구하기
	square(n, a);
	display(2, &a, &n);

}

Leave a Reply

Your email address will not be published. Required fields are marked *