//n×n正方行列Aに対して、Aのk乗を求めるプログラム
#include <stdio.h>
#define N 5
void Input_matrix(float (*X)[N],int n)
{
int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("行列Aの%d行%d列成分の値を入力してください\n",i+1,j+1);
scanf("%f",&X[i][j]);
}
}
return ;
}
void Multiply_matrix(float (*X)[N],float (*Y)[N],float (*Z)[N],float (*W)[N],int n,int k)
{
int h=0,i=0,j=0,p=0;
if(k==1)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
Z[i][j]=X[i][j];
}
}
return;
}
else
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(p=0;p<n;p++)
{
Z[i][j]+=X[i][p]*Y[p][j];
}
}
}
if(k==2)
{
return;
}
else//累乗
{
for(h=2;h<k;h++)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(p=0;p<n;p++)
{
W[i][j]+=Z[i][p]*Y[p][j];
} }
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
Z[i][j]=W[i][j];
W[i][j]=0;
}
}
}
}
return;
}
}
void Print_matrix(float (*Y)[N], int n)
{
int i=0, j=0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("[%d][%d]=%f\n", i + 1, j + 1, Y[i][j]);
}
}
return;
}
int main(void)
{
float X[N][N]={{0}},Y[N][N]={{0}},Z[N][N]={{0}};
int n=0,k=0;
printf("n(0<n<=5 nは整数)を決めてください。n=");
scanf("%d",&n);
if(n>5||n<=0)
{
printf("エラー:n<=5となるnを入力してください\n");
return (-1);
}
Input_matrix(X,n);//行列の入力
printf("k乗なるk(kは自然数)を入力してください\n[行][列]\n");
scanf("%d",&k);
if(k<=0)
{
printf("エラー:kは自然数です");
return(-1);
}
Multiply_matrix(X,X,Y,Z,n,k);//行列の計算
Print_matrix(Y, n);
return 0;
}
これは行列を累乗するプログラムなのですが、行列をコピーしてk乗してます。
でもこれをポインタを使ってコピーせずにk乗したいのです><
あとkが奇数、偶数のときで場合わけしなくてもいいようにしないといけないです・・・
(**p)[ ]という風なものをつかうようなのですが、今いちこの意味もわかってません。。。
どなたかお願いします