プロが教えるわが家の防犯対策術!

  1 2 -1
D= 3 0 -2
  -1 1 2

の3次正方行列のn乗を計算するプログラムを作成しています。
いろいろと試してみましたがうまくいきません。
どなたか教えていただけるとうれしいです。
よろしくおねがいします。



#include <stdio.h>

int main(void)
{
int a[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} };
int b[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} };
int s[3][3];
int m,n;
int i,j,k;


printf("[A]^n;n = ");scanf("%d",&n);

for (m=2;m <= n;m++){
for (i=0;i<3;i++){
for (j=0;j<3;j++){
s[i][j] = 0;
for(k=0;k<3;k++){
s[i][j] =s[i][j] + a[i][k] * b[k][j];
}
}
}


for(i=0;i<3;i++){
for(j=0;j<3;j++){
b[i][j]=s[i][j];
}
}
printf("%3d",s[i][j]);
putchar('\n');
}
return (0);
}

A 回答 (4件)

最後の表示だけじゃないですか。



ループの外に出てる

>printf("%3d",s[i][j]);
    • good
    • 1

計算方法はあってます。


違っているのは次の2箇所です。
(1) 行列a, bの値設定
(2) 計算結果の表示

> int a[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} };
> int b[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} };

1行1列目の要素(つまりa[0][0]とb[0][0]の値)が-1になっています。
行列Dの1行1列目の要素は1ですよね。

> printf("%3d",s[i][j]);
> putchar('\n');

この2行だけだとs[3][3]だけを表示して終わってしまいます。
また、この位置で出力してしまうと2乗 ~ n乗の結果が全部表示されてしまいます。

n乗の結果のみを出力したいなら、
この2行を消してreturn文の直前に

for(i = 0; i < 3; i++){
 for(j = 0; j < 3; j++){
  printf("%3d",s[i][j]);
 }
 putchar('\n');
}

と打ち込んでみましょう
(ちなみに上のコードは全角空白を含んでいるので、
回答文からこのコードをコピー&ペーストしてしまうと
コンパイルエラーが起きるので注意してください)。
    • good
    • 0
この回答へのお礼

質問の記入ミスのご指摘ありがとうございました。
また指摘された所を直したらうまく実行できました。
ありがとうございました。

お礼日時:2010/11/22 16:22

カテゴリー違いです。


そのプログラムでは、n が 2 以上であれば、
return の直前の時点で、s[][] の中に
a[][] の n 乗が正しく求められています。
デバッガ上で s の値を確認すれば判ことです。
表示が上手くいかないとすれば、
数学以外の点に誤りがあります。
    • good
    • 0

printf("%3d",s[i][j]);



ここ,上の i,j の for 文抜けた後だから,
i=3, j=3 の s[3][3]  つまり,
行列の 4,4 成分を表示している.

コンパイルエラーか segmentation faults か意味のない数を表示するか
のどれか

printf("%3d",s[i][j]);
putchar('\n');

の2行を

for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%3d",s[i][j]);
}
putchar('\n');


に置き換える.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!