행렬의 거듭 제곱 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); }