
2行2列を5乗させるプログラムを作って、一応できたつもりだったんですが結果が合いません・・・
何かヒントでもいいのでわかる方いらっしゃいましたらよろしくお願いします。
<プログラム>
#include <stdio.h>
#define N 2
int A[N][N];
int A_NEW[N][N];
int A_5[N][N]; /* 行列Aを5乗したもの */
int main()
{
int i,j,k,l;
/* 2行2列の係数行列Aの成分を入力 */
printf("係数行列Aを%d行%d列で入力してください\n", N, N);
for( i=0; i<N; i++)
{
for( j=0; j<N; j++)
{
printf("A[%d][%d]=", i+1, j+1);
scanf("%d", &A[i][j]);
}
}
for(i=0; i<N; i++)/* A_NEW=A*Aの計算 */
{
for(j=0; j<N; j++)
{
for(k=0; k<N; k++)
{
A_NEW[i][j] += A[i][k] * A[k][j];
}
}
}
for(l=0; l<3; l++)
{
for(i=0; i<N; i++)/* A_5の計算 */
{
for(j=0; j<N; j++)
{
for(k=0; k<N; k++)
{
A_5[i][j] += A_NEW[i][k] * A[k][j];
}
}
}
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
A_NEW[i][j] = A_5[i][j];
}
}
}
printf("A_5=\n"); /* 出力 */
for( i=0; i<N; i++)
{
for( j=0; j<N; j++)
{
printf("%d ", A_5[i][j]);
}
printf("\n");
}
}
<入力例>
A=
1 3
2 1
<期待する結果>
A=
241 303
202 241
<このプログラムの結果>
406 498
332 406
No.2ベストアンサー
- 回答日時:
#include <stdio.h>
#define N 2
int A[N][N];
int A_NEW[N][N];
int A_5[N][N]; /* 行列Aを5乗したもの */
int main()
{
int i,j,k,l;
/* 2行2列の係数行列Aの成分を入力 */
printf("係数行列Aを%d行%d列で入力してください\n", N, N);
for( i=0; i<N; i++)
{
for( j=0; j<N; j++)
{
printf("A[%d][%d]=", i+1, j+1);
scanf("%d", &A[i][j]);
}
}
for(i=0; i<N; i++) /* A_NEW=A*Aの計算 */
{
for(j=0; j<N; j++)
{
for(k=0; k<N; k++)
{
A_NEW[i][j] += A[i][k] * A[k][j];
}
}
}
for(l=0; l<3; l++)
{
for(i=0; i<N; i++) /* A_5の計算 */
{
for(j=0; j<N; j++)
{
for(k=0; k<N; k++)
{
A_5[i][j] += A_NEW[i][k] * A[k][j]; /* …P */
}
}
}
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
A_NEW[i][j] = A_5[i][j];
}
}
/* 一端0に戻さないと残存している結果にPを足されることになる …Q*/
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
A_5[i][j] = 0;
}
}
}
printf("A_5=\n"); /* 出力 */
for( i=0; i<N; i++)
{
for( j=0; j<N; j++)
{
printf("%d ", A_NEW[i][j]); /* Qで0に戻しちゃったので出力結果の変数が変わっています。*/
}
printf("\n");
}
}
/*
ただ,個人的には,二つの行列を計算するだけの関数を分けて
mainから5回呼び出した方が綺麗だと思う
面倒なので書かないけど,ここまで自力でコード書く人なら
これだけできちんと書けるだけの人なはず。頑張ってね!
*/
No.3
- 回答日時:
他の方が指摘をされているので,サンプル書いてみました.
------
int A[N][N] = {{1,3},{2,1}};//入力
int R[N][N] = {{1,0},{0,1}};//出力 単位行列で初期化
int i, j, k,l;
for(l = 0; l < 5; l++){
//i行目の処理
for (i = 0; i < N; i++) {
//i行目をTに記憶
int T[N];
for (k = 0; k < N; k++)
T[k] = R[i][k];
//i行目の計算
for (j = 0; j < N; j++) {
//i行j列目を計算
int tmp = 0;
for (k = 0; k < N; k++)
tmp += T[k] * A[k][j];
R[i][j] = tmp;
}
}
}
------
R = R * A
積の計算では,Rのi行目の計算を始める前にまず,i行目を記憶.
記憶したi行目とAのi列目を計算してRのi行目へ記憶としています.
こうすることで,RとAだけで計算を進めることができます.
5乗の計算は,入力としてR,A(入力)を取り,出力としてRを出力するようにしてみました.
Rの初期値を R = E(Eは単位行列) として R = R * A を5回まわしています.
一回目は,R = E * A = A,2回目は R = R * A = Aの2乗となっていきます.
定式化(設計)をきっちりとせずにコーディングに移ると,その場で作った曖昧な処理がうまく働かないことが多いので
PCに向かう前に,紙に式などを書いてみると返って早く完成しますよ.
なるほどー
こっちの方がシンプルですね!
わかりやすく書いていただきありがとうございます!
一応先に紙に書いてから作ってるんですが、まだ勉強し始めて
1週間ちょっとなのでまだまだ完成に至るまでには甘いです・・・
No.1
- 回答日時:
デバッガを使って 変数の値を追いかけましょう
for(i=0; i<N; i++) /* A_NEW=A*Aの計算 */
{
for(j=0; j<N; j++)
{
for(k=0; k<N; k++)
{
A_NEW[i][j] += A[i][k] * A[k][j];
}
}
}
のループの中で A_NEW[i][j]の期待する値と実際の値を比べて見ましょう
+= で代入 & 加算をしているので kのループに入る前のA_NEW[i][j]の値はどうなっているのが正常なのでしょう
ご意見ありがとうございます。
ただ、まだデバッガの使い方を習っていないのでわからないです・・・
代わりにprintfで逐次調べてみます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
C言語 数字以外を入力させない...
-
全角文字の判定
-
getcの改行判定
-
scanfが実行されません
-
c言語で平均をだす
-
c言語のwhile文を使った計算で...
-
C言語 マスターマインドゲーム...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
2進数、16進数、10進数のことを...
-
複数桁10進数の*桁目だけを抽出...
-
エクセルで可視セルにのみ値貼...
-
20'(角度)の計算がわかりま...
-
C言語での引数の省略方法
-
DWORDの実際の型は何でしょうか
-
ある商品のロス率を5%見込み、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
配列を使って魔方陣
-
プログラミングで二番目に大き...
-
getcの改行判定
-
C言語の二分法のプログラムにつ...
-
C言語階乗の総和を求める
-
C言語 プログラム
-
c言語のプログラミングでこま...
-
1からnまでの和を求めるプログ...
-
初心者です。for文、if文を使っ...
-
計算結果がlong型以上になる場...
-
while文について、c言語...
-
最大値と最小値を表示したいの...
-
scanf関数を用いての加減乗除%...
-
プログラムの内容
-
10進数からN進数に変換するプロ...
-
scanfが実行されません
おすすめ情報