再帰を使うと簡単かもしれない。
でもないか。
#define _CRT_SECURE_NO_WARNINGS // Visual Studio only
#include <stdio.h>
void func(double A[], double B[], int n) {
if (n == 0) {
B[0] = 1;
B[1] = 0;
B[2] = 0;
B[3] = 1;
} else {
func(A, B, n - 1);
double T[4];
/*
/ B0 B1 | * / A0 A1 |
| B2 B3 / | A2 A3 /
= / B0*A0+B1*A2 B0*A1+B1*A3 |
| B2*A0+B3*A2 B2*A1+B3*A3 /
*/
T[0] = B[0]*A[0] + B[1]*A[2];
T[1] = B[0]*A[1] + B[1]*A[3];
T[2] = B[2]*A[0] + B[3]*A[2];
T[3] = B[2]*A[1] + B[3]*A[3];
B[0] = T[0];
B[1] = T[1];
B[2] = T[2];
B[3] = T[3];
}
}
void dsp(const double a[]) {
printf("%6.2f %6.2f\n" , a[0], a[1]);
printf("%6.2f %6.2f\n\n", a[2], a[3]);
}
int main(void) {
double A[4], B[4];
printf("行列Aの1行目> ");
scanf("%lf%lf", &A[0], &A[1]);
printf("行列Aの2行目> ");
scanf("%lf%lf", &A[2], &A[3]);
int n;
printf("n> ");
scanf("%d", &n);
func(A, B, n);
dsp(A);
dsp(B);
}