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