#include<stdio.h>
int gcdf(int x, int y){
return(y == 0 ? x :gcdf(y , x%y) ); /*最大公約数を求める*/
}
int gcd(int a, int b){
/* ★負だった場合に自信がないので敢えて追加 */
int c = (a >= 0) ? a : -a ;
int d = (b >= 0) ? b : -b ;
return(c > d ? gcdf(c, d) : gcdf(d, c)); /*恐らくここも間違いの1つ、gcd(a,a)をどうなおせばいいか*/
/* ★まぁ考えなくていいといえば良い。 商が0で余りが出るとき結局逆転するからね */
}
int main(void){
int buf[2]; /*データ保存*/
int i, j, k; /*カウンタ*/
int g; /* ★この公約数はカウンタではない。ベストアンサーもらってから編集 */
int n = 4; /*配列の次数*/
int a[4][4][2] = {
{{1,1},{2,1},{0,1},{1,2}}, /*問題の行列*/
{{0,1},{2,3},{1,1},{0,1}},
{{1,1},{0,1},{0,1},{-1,1}},
{{1,1},{0,1},{-1,2},{-1,1}}
};
int inv_a[4][4][2] = {
{{1,1},{0,1},{0,1},{0,1}}, /*単位行列*/
{{0,1},{1,1},{0,1},{0,1}},
{{0,1},{0,1},{1,1},{0,1}},
{{0,1},{0,1},{0,1},{1,1}}
};
for(i = 0; i < n; i++){
buf[0] = a[i][i][1]; //分子
buf[1] = a[i][i][0]; //分母
for(j = 0; j < n; j++){
a[i][j][0] *= buf[0];
a[i][j][1] *= buf[1];
g = gcd(a[i][j][0], a[i][j][1]);
a[i][j][0] = a[i][j][0] / g;
a[i][j][1] = a[i][j][1] / g; //約分
inv_a[i][j][0] *= buf[0];
inv_a[i][j][1] *= buf[1];
g = gcd(inv_a[i][j][0], inv_a[i][j][1]);
inv_a[i][j][0] = inv_a[i][j][0] / g;
inv_a[i][j][1] = inv_a[i][j][1] / g; //約分
}
/* ★ ピボット選択の必要性については面倒なので検討してません */
for(j = 0; j < n; j++){
if(i != j){ /* ★分岐は1行でいいの? =>多分駄目…自信ないけど。Guard Clauseみたいに早めに次ループを回しても良いかも */
buf[0] = a[j][i][0];
buf[1] = a[j][i][1];
for(k = 0; k < n; k++){
a[j][k][0] = a[j][k][0] * a[i][k][1] * buf[1] - a[j][k][1] * a[i][k][0] * buf[0];
a[j][k][1] = a[j][k][1] * a[i][k][1] * buf[1];
g = gcd(a[j][k][0], a[j][k][1]);
a[j][k][0] = a[j][k][0] / g;
a[j][k][1] = a[j][k][1] / g;
inv_a[j][k][0] = inv_a[j][k][0] * inv_a[i][k][1] * buf[1] - inv_a[j][k][1]* inv_a[i][k][0] * buf[0];
inv_a[j][k][1] = inv_a[j][k][1] * inv_a[i][k][1] * buf[1];
g = gcd(inv_a[j][k][0], inv_a[j][k][1]);
inv_a[j][k][0] = inv_a[j][k][0] / g;
inv_a[j][k][1] = inv_a[j][k][1] / g;
}
}
}
}
/* ★改行入れたりして見やすさ改善 */
printf("1 2 0 1/2 \n 0 2/3 1 0 \n 1 0 0 -1 \n 1 0 -1/2 -1 \nの逆行列は以下の通り\n");
for(i = 0; i < n; i++){ /*逆行列出力*/
for(j = 0; j < n; j++){
if(inv_a[i][j][1] < 0){ /* ★条件にミスがある。そもそも代入するな */
inv_a[i][j][0] *= (-1);
inv_a[i][j][1] *= (-1); /*分母のマイナスをプラスに*/
}
/*分母が1の時に整数表示*/
if(inv_a[i][j][1] != 1){
printf("%d/%d ", inv_a
[i
][j
][0],inv_a
[i
][j
][1]); }
else{
printf("%d ", inv_a
[i
][j
][0]); }
}
}
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KCmludCBnY2RmKGludCB4LCBpbnQgeSl7CglyZXR1cm4oeSA9PSAwID8geCA6Z2NkZih5ICwgeCV5KSApOyAvKuacgOWkp+WFrOe0hOaVsOOCkuaxguOCgeOCiyovCn0KCmludCBnY2QoaW50IGEsIGludCBiKXsKCS8qIOKYheiyoOOBoOOBo+OBn+WgtOWQiOOBq+iHquS/oeOBjOOBquOBhOOBruOBp+aVouOBiOOBpui/veWKoCAqLwoJaW50IGMgPSAoYSA+PSAwKSA/IGEgOiAtYSA7CglpbnQgZCA9IChiID49IDApID8gYiA6IC1iIDsKCQoJcmV0dXJuKGMgPiBkID8gZ2NkZihjLCBkKSA6IGdjZGYoZCwgYykpOyAvKuaBkOOCieOBj+OBk+OBk+OCgumWk+mBleOBhOOBru+8keOBpOOAgWdjZChhLGEp44KS44Gp44GG44Gq44GK44Gb44Gw44GE44GE44GLKi8KICAgIC8qIOKYheOBvuOBgeiAg+OBiOOBquOBj+OBpuOBhOOBhOOBqOOBhOOBiOOBsOiJr+OBhOOAgiDllYbjgYww44Gn5L2Z44KK44GM5Ye644KL44Go44GN57WQ5bGA6YCG6Lui44GZ44KL44GL44KJ44GtICovCn0KCmludCBtYWluKHZvaWQpewoJaW50IGJ1ZlsyXTsgLyrjg4fjg7zjgr/kv53lrZgqLwoJaW50IGksIGosIGs7ICAgLyrjgqvjgqbjg7Pjgr8qLwoJaW50IGc7IC8qIOKYheOBk+OBruWFrOe0hOaVsOOBr+OCq+OCpuODs+OCv+OBp+OBr+OBquOBhOOAguODmeOCueODiOOCouODs+OCteODvOOCguOCieOBo+OBpuOBi+OCiee3qOmbhiAqLwoJaW50IG4gPSA0OyAvKumFjeWIl+OBruasoeaVsCovCgoKCWludCBhWzRdWzRdWzJdID0gewoJCQkJCQl7ezEsMX0sezIsMX0sezAsMX0sezEsMn19LCAvKuWVj+mhjOOBruihjOWIlyovCgkJCQkJCXt7MCwxfSx7MiwzfSx7MSwxfSx7MCwxfX0sCgkJCQkJCXt7MSwxfSx7MCwxfSx7MCwxfSx7LTEsMX19LAoJCQkJCQl7ezEsMX0sezAsMX0sey0xLDJ9LHstMSwxfX0KCQkJCQl9OwoKCWludCBpbnZfYVs0XVs0XVsyXSA9IHsKCQkJCQkJCXt7MSwxfSx7MCwxfSx7MCwxfSx7MCwxfX0sIC8q5Y2Y5L2N6KGM5YiXKi8KCQkJCQkJCXt7MCwxfSx7MSwxfSx7MCwxfSx7MCwxfX0sCgkJCQkJCQl7ezAsMX0sezAsMX0sezEsMX0sezAsMX19LAoJCQkJCQkJe3swLDF9LHswLDF9LHswLDF9LHsxLDF9fQoJCQkJCQl9OwoJZm9yKGkgPSAwOyBpIDwgbjsgaSsrKXsKCgkJYnVmWzBdID0gYVtpXVtpXVsxXTsgLy/liIblrZAKCQlidWZbMV0gPSBhW2ldW2ldWzBdOyAvL+WIhuavjQoKCgkJZm9yKGogPSAwOyBqIDwgbjsgaisrKXsKCgkJCWFbaV1bal1bMF0gKj0gYnVmWzBdOwoJCQlhW2ldW2pdWzFdICo9IGJ1ZlsxXTsKCgkJCWcgPSBnY2QoYVtpXVtqXVswXSwgYVtpXVtqXVsxXSk7CgoJCQlhW2ldW2pdWzBdID0gYVtpXVtqXVswXSAvIGc7CgkJCWFbaV1bal1bMV0gPSBhW2ldW2pdWzFdIC8gZzsgLy/ntITliIYKCgoJCQlpbnZfYVtpXVtqXVswXSAqPSBidWZbMF07CgkJCWludl9hW2ldW2pdWzFdICo9IGJ1ZlsxXTsKCgkJCWcgPSBnY2QoaW52X2FbaV1bal1bMF0sIGludl9hW2ldW2pdWzFdKTsKCgkJCWludl9hW2ldW2pdWzBdID0gaW52X2FbaV1bal1bMF0gLyBnOwoJCQlpbnZfYVtpXVtqXVsxXSA9IGludl9hW2ldW2pdWzFdIC8gZzsgLy/ntITliIYKCgkJfQoJCS8qIOKYhSDjg5Tjg5zjg4Pjg4jpgbjmip7jga7lv4XopoHmgKfjgavjgaTjgYTjgabjga/pnaLlgJLjgarjga7jgafmpJzoqI7jgZfjgabjgb7jgZvjgpMgKi8KCQlmb3IoaiA9IDA7IGogPCBuOyBqKyspewoKCQkJaWYoaSAhPSBqKXsgLyog4piF5YiG5bKQ44GvMeihjOOBp+OBhOOBhOOBru+8nyA9PuWkmuWIhumnhOebruKApuiHquS/oeOBquOBhOOBkeOBqeOAgkd1YXJkIENsYXVzZeOBv+OBn+OBhOOBq+aXqeOCgeOBq+asoeODq+ODvOODl+OCkuWbnuOBl+OBpuOCguiJr+OBhOOBi+OCgiAqLwoKCQkJCWJ1ZlswXSA9IGFbal1baV1bMF07IAoJCQkJYnVmWzFdID0gYVtqXVtpXVsxXTsKCgkJCQlmb3IoayA9IDA7IGsgPCBuOyBrKyspewoKCQkJCQlhW2pdW2tdWzBdID0gYVtqXVtrXVswXSAqIGFbaV1ba11bMV0gKiBidWZbMV0gLSBhW2pdW2tdWzFdICogYVtpXVtrXVswXSAqIGJ1ZlswXTsKCQkJCQlhW2pdW2tdWzFdID0gYVtqXVtrXVsxXSAqIGFbaV1ba11bMV0gKiBidWZbMV07CgoJCQkJCWcgPSBnY2QoYVtqXVtrXVswXSwgYVtqXVtrXVsxXSk7CgoJCQkJCWFbal1ba11bMF0gPSBhW2pdW2tdWzBdIC8gZzsKCQkJCQlhW2pdW2tdWzFdID0gYVtqXVtrXVsxXSAvIGc7CgoKCQkJCQlpbnZfYVtqXVtrXVswXSA9IGludl9hW2pdW2tdWzBdICogaW52X2FbaV1ba11bMV0gKiBidWZbMV0gLSBpbnZfYVtqXVtrXVsxXSogaW52X2FbaV1ba11bMF0gKiBidWZbMF07CgoJCQkJCWludl9hW2pdW2tdWzFdID0gaW52X2Fbal1ba11bMV0gKiBpbnZfYVtpXVtrXVsxXSAqIGJ1ZlsxXTsKCgkJCQkJZyA9IGdjZChpbnZfYVtqXVtrXVswXSwgaW52X2Fbal1ba11bMV0pOwoKCQkJCQlpbnZfYVtqXVtrXVswXSA9IGludl9hW2pdW2tdWzBdIC8gZzsKCQkJCQlpbnZfYVtqXVtrXVsxXSA9IGludl9hW2pdW2tdWzFdIC8gZzsKCgkJCQl9CgkJCX0KCQl9Cgl9CgoKCS8qIOKYheaUueihjOWFpeOCjOOBn+OCiuOBl+OBpuimi+OChOOBmeOBleaUueWWhCAqLwoJcHJpbnRmKCIxIDIgMCAxLzIgXG4gMCAyLzMgMSAwIFxuIDEgMCAwIC0xIFxuIDEgMCAtMS8yIC0xIFxu44Gu6YCG6KGM5YiX44Gv5Lul5LiL44Gu6YCa44KKXG4iKTsKCglmb3IoaSA9IDA7IGkgPCBuOyBpKyspeyAvKumAhuihjOWIl+WHuuWKmyovCgkJZm9yKGogPSAwOyBqIDwgbjsgaisrKXsKCQkJaWYoaW52X2FbaV1bal1bMV0gPCAwKXsgLyog4piF5p2h5Lu244Gr44Of44K544GM44GC44KL44CC44Gd44KC44Gd44KC5Luj5YWl44GZ44KL44GqICovCgkJCQlpbnZfYVtpXVtqXVswXSAqPSAoLTEpOwoJCQkJaW52X2FbaV1bal1bMV0gKj0gKC0xKTsgLyrliIbmr43jga7jg57jgqTjg4rjgrnjgpLjg5fjg6njgrnjgasqLwoJCQl9CgoJCQkvKuWIhuavjeOBjO+8keOBruaZguOBq+aVtOaVsOihqOekuiovCgkJCQoJCQlpZihpbnZfYVtpXVtqXVsxXSAhPSAxKXsKCQkJCXByaW50ZigiJWQvJWQgIiwgaW52X2FbaV1bal1bMF0saW52X2FbaV1bal1bMV0pOwoJCQl9CgkJCWVsc2V7CgkJCQlwcmludGYoIiVkICIsIGludl9hW2ldW2pdWzBdKTsKCQkJfQoJCX0KCQlwcmludGYoIlxuIik7Cgl9CgoJcmV0dXJuIDA7Cn0=