#define _CRT_SECURE_NO_WARNINGS // Visual Studio のときは入れてください
#include <math.h>
#include <stdio.h>
#ifndef SIZE
#define SIZE (16)
#endif
double matA[SIZE][SIZE], matE[SIZE][SIZE], vecX[SIZE];
void dump(int n) {
int j, k;
for (k = 0; k < n; k++) {
for (j = 0; j < n; j++)
printf(" %10.3le", matA
[k
][j
]); for (j = 0; j < n; j++)
printf(" %10.3le", matE
[k
][j
]); }
}
int main(int argc, char **argv) {
double C, D, ratio, big;
int n, i, j, k, r, pivot_row;
char copyright[] = "Written by ********: ****/**/**\n";
int ch, verbose;
// getopt は Visual Studio に含まれていない。自作するか探すこと
while ((ch = getopt(argc, argv, "vh")) != -1) {
if (ch == 'v')
verbose = 1;
if (ch == 'h') {
printf("\t-v: dumps intermediate results.\n"); printf("\t-h: shows help message, as you see now.\n"); return 1;
}
}
// ターミナルから指定できないので
verbose = 1;
/* データ入力 */
if (n > SIZE) {
printf("N should be less than or equal to %d.\n", SIZE
); return 1;
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%lf", &(matA
[i
][j
])); }
scanf("%lf", &(vecX
[i
])); }
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf(" %12.5le", matA
[i
][j
]); }
printf(" | %12.5le\n", vecX
[i
]); }
/* 単位行列の設定 */
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
matE[i][j] = 0.0;
}
matE[i][i] = 1.0;
}
/* Solve */
if (verbose)
dump(n);
for (i = 0; i < n; i++) {
printf("############ i=%d", i
); if (verbose)
dump(n);
// C はここで表示すべきでない。ピボット選択による並べ替えが終わった後。
// C = matA[i][i];
// printf("C=%.2f\n", C);
/* ピボット選択による並べ替え(始) */
big = 0.0;
/* i列で最大値を検索 */
// if (C < 1.0e-04 && -1.0e-04 < C) { // 削除。ここで判定するとピボット選択が始まらない
for (k = i; k < n; k++) { // k = 0 を k = i に訂正。既にピボット選択が終わった行は残す
if (fabs(matA
[k
][i
]) > big
) { pivot_row = k;
}
}
/* 検索した最大値が0または小さい値であったら計算できないと返す */
if (big < 1.0e-04 && -1.0e-04 < big) {
return 0;
}
/*最大値を含む行と入れ替え*/
if (i != pivot_row) {
for (k = 0; k < n; k++) {
D = matA[i][k];
matA[i][k] = matA[pivot_row][k];
matA[pivot_row][k] = D;
D = matE[i][k]; // matE の入れ替えが抜けている
matE[i][k] = matE[pivot_row][k];
matE[pivot_row][k] = D;
}
D = vecX[i]; // [k] を [i] に訂正
vecX[i] = vecX[pivot_row];
vecX[pivot_row] = D;
}
// } // 削除
/*ピボット選択による並べ替え(終)*/
C = matA[i][i]; // ここに移動
printf("C=%.2f\n", C
); // ここに移動
/********************************************/
/** i 列目前半の処理 **/
/********************************************/
for (k = 0; k < n; k++) {
matA[i][k] = matA[i][k] / C;
matE[i][k] = matE[i][k] / C;
}
vecX[i] = vecX[i] / C;
if (verbose)
dump(n);
for (k = 0; k < n; k++) { /* 行のループ */
if (i != k) {
D = matA[k][i];
/********************************************/
/** i 列目後半の処理 **/
/********************************************/
for (j = 0; j < n; j++) { /* 列のループ */
matA[k][j] = matA[k][j] - D * matA[i][j];
matE[k][j] = matE[k][j] - D * matE[i][j];
}
vecX[k] = vecX[k] - D * vecX[i];
}
}
if (verbose)
dump(n);
}
/* 計算結果出力 */
for (i = 0; i < n; i++)
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf(" %12.5le", matE
[i
][j
]); }
}
I2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAvLyBWaXN1YWwgU3R1ZGlvIOOBruOBqOOBjeOBr+WFpeOCjOOBpuOBj+OBoOOBleOBhAojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCiNpZm5kZWYgU0laRQojZGVmaW5lIFNJWkUgKDE2KQojZW5kaWYKCmRvdWJsZSBtYXRBW1NJWkVdW1NJWkVdLCBtYXRFW1NJWkVdW1NJWkVdLCB2ZWNYW1NJWkVdOwoKdm9pZCBkdW1wKGludCBuKSB7CiAgICBpbnQgaiwgazsKICAgIGZvciAoayA9IDA7IGsgPCBuOyBrKyspIHsKICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykKICAgICAgICAgICAgcHJpbnRmKCIgJTEwLjNsZSIsIG1hdEFba11bal0pOwogICAgICAgIHByaW50ZigiICUxMC4zbGUgIiwgdmVjWFtrXSk7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykKICAgICAgICAgICAgcHJpbnRmKCIgJTEwLjNsZSIsIG1hdEVba11bal0pOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgIGRvdWJsZSBDLCBELCByYXRpbywgYmlnOwogICAgaW50IG4sIGksIGosIGssIHIsIHBpdm90X3JvdzsKICAgIGNoYXIgY29weXJpZ2h0W10gPSAiV3JpdHRlbiBieSAqKioqKioqKjogKioqKi8qKi8qKlxuIjsKICAgIGludCBjaCwgdmVyYm9zZTsKCi8vIGdldG9wdCDjga8gVmlzdWFsIFN0dWRpbyDjgavlkKvjgb7jgozjgabjgYTjgarjgYTjgILoh6rkvZzjgZnjgovjgYvmjqLjgZnjgZPjgagKICAgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgInZoIikpICE9IC0xKSB7CiAgICAgICAgaWYgKGNoID09ICd2JykKICAgICAgICAgICAgdmVyYm9zZSA9IDE7CiAgICAgICAgaWYgKGNoID09ICdoJykgewogICAgICAgICAgICBwcmludGYoIk9wdGlvbnM6XG4iKTsKICAgICAgICAgICAgcHJpbnRmKCJcdC12OiBkdW1wcyBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiIpOwogICAgICAgICAgICBwcmludGYoIlx0LWg6IHNob3dzIGhlbHAgbWVzc2FnZSwgYXMgeW91IHNlZSBub3cuXG4iKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9Ci8vIOOCv+ODvOODn+ODiuODq+OBi+OCieaMh+WumuOBp+OBjeOBquOBhOOBruOBpwogICAgdmVyYm9zZSA9IDE7CgogICAgLyog44OH44O844K/5YWl5YqbICovCiAgICBzY2FuZigiJWQiLCAmbik7CiAgICBpZiAobiA+IFNJWkUpIHsKICAgICAgICBwcmludGYoIk4gc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlZC5cbiIsIFNJWkUpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgIHNjYW5mKCIlbGYiLCAmKG1hdEFbaV1bal0pKTsKICAgICAgICB9CiAgICAgICAgc2NhbmYoIiVsZiIsICYodmVjWFtpXSkpOwogICAgfQoKICAgIHByaW50ZigiSW5wdXRzOlxuIik7CgogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIgJTEyLjVsZSIsIG1hdEFbaV1bal0pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIiB8ICUxMi41bGVcbiIsIHZlY1hbaV0pOwogICAgfQoKICAgIC8qIOWNmOS9jeihjOWIl+OBruioreWumiAqLwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgbWF0RVtpXVtqXSA9IDAuMDsKICAgICAgICB9CiAgICAgICAgbWF0RVtpXVtpXSA9IDEuMDsKICAgIH0KCiAgICAvKiBTb2x2ZSAqLwogICAgaWYgKHZlcmJvc2UpCiAgICAgICAgZHVtcChuKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CgogICAgICAgIHByaW50ZigiIyMjIyMjIyMjIyMjIGk9JWQiLCBpKTsKICAgICAgICBpZiAodmVyYm9zZSkKICAgICAgICAgICAgZHVtcChuKTsKICAgICAgICBwcmludGYoIi0tLS0tLS1cbiIpOwoKLy8gQyDjga/jgZPjgZPjgafooajnpLrjgZnjgbnjgY3jgafjgarjgYTjgILjg5Tjg5zjg4Pjg4jpgbjmip7jgavjgojjgovkuKbjgbnmm7/jgYjjgYzntYLjgo/jgaPjgZ/lvozjgIIKLy8gICAgICBDID0gbWF0QVtpXVtpXTsKLy8gICAgICBwcmludGYoIkM9JS4yZlxuIiwgQyk7CgogICAgICAgIC8qIOODlOODnOODg+ODiOmBuOaKnuOBq+OCiOOCi+S4puOBueabv+OBiCjlp4spICovCgogICAgICAgIGJpZyA9IDAuMDsKCiAgICAgICAgLyogaeWIl+OBp+acgOWkp+WApOOCkuaknOe0oiAqLwoKLy8gICAgICBpZiAoQyA8IDEuMGUtMDQgJiYgLTEuMGUtMDQgPCBDKSB7IC8vIOWJiumZpOOAguOBk+OBk+OBp+WIpOWumuOBmeOCi+OBqOODlOODnOODg+ODiOmBuOaKnuOBjOWni+OBvuOCieOBquOBhAogICAgICAgICAgICBmb3IgKGsgPSBpOyBrIDwgbjsgaysrKSB7IC8vIGsgPSAwIOOCkiBrID0gaSDjgavoqILmraPjgILml6Ljgavjg5Tjg5zjg4Pjg4jpgbjmip7jgYzntYLjgo/jgaPjgZ/ooYzjga/mrovjgZkKICAgICAgICAgICAgICAgIGlmIChmYWJzKG1hdEFba11baV0pID4gYmlnKSB7CiAgICAgICAgICAgICAgICAgICAgYmlnID0gZmFicyhtYXRBW2tdW2ldKTsKICAgICAgICAgICAgICAgICAgICBwaXZvdF9yb3cgPSBrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIOaknOe0ouOBl+OBn+acgOWkp+WApOOBjDDjgb7jgZ/jga/lsI/jgZXjgYTlgKTjgafjgYLjgaPjgZ/jgonoqIjnrpfjgafjgY3jgarjgYTjgajov5TjgZkgKi8KCiAgICAgICAgICAgIGlmIChiaWcgPCAxLjBlLTA0ICYmIC0xLjBlLTA0IDwgYmlnKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIkludmFsaWQgbWF0cml4Iik7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyrmnIDlpKflgKTjgpLlkKvjgoDooYzjgajlhaXjgozmm7/jgYgqLwoKICAgICAgICAgICAgaWYgKGkgIT0gcGl2b3Rfcm93KSB7CiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbjsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgRCA9IG1hdEFbaV1ba107CiAgICAgICAgICAgICAgICAgICAgbWF0QVtpXVtrXSA9IG1hdEFbcGl2b3Rfcm93XVtrXTsKICAgICAgICAgICAgICAgICAgICBtYXRBW3Bpdm90X3Jvd11ba10gPSBEOwoKICAgICAgICAgICAgICAgICAgICBEID0gbWF0RVtpXVtrXTsgLy8gbWF0RSDjga7lhaXjgozmm7/jgYjjgYzmipzjgZHjgabjgYTjgosKICAgICAgICAgICAgICAgICAgICBtYXRFW2ldW2tdID0gbWF0RVtwaXZvdF9yb3ddW2tdOwogICAgICAgICAgICAgICAgICAgIG1hdEVbcGl2b3Rfcm93XVtrXSA9IEQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBEID0gdmVjWFtpXTsgLy8gW2tdIOOCkiBbaV0g44Gr6KiC5q2jCiAgICAgICAgICAgICAgICB2ZWNYW2ldID0gdmVjWFtwaXZvdF9yb3ddOwogICAgICAgICAgICAgICAgdmVjWFtwaXZvdF9yb3ddID0gRDsKICAgICAgICAgICAgfQovLyAgICAgIH0gLy8g5YmK6ZmkCiAgICAgICAgLyrjg5Tjg5zjg4Pjg4jpgbjmip7jgavjgojjgovkuKbjgbnmm7/jgYgo57WCKSovCgogICAgICAgIEMgPSBtYXRBW2ldW2ldOyAgICAgICAgLy8g44GT44GT44Gr56e75YuVCiAgICAgICAgcHJpbnRmKCJDPSUuMmZcbiIsIEMpOyAvLyDjgZPjgZPjgavnp7vli5UKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIC8qKiBpIOWIl+ebruWJjeWNiuOBruWHpueQhiAqKi8KICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAgIGZvciAoayA9IDA7IGsgPCBuOyBrKyspIHsKICAgICAgICAgICAgbWF0QVtpXVtrXSA9IG1hdEFbaV1ba10gLyBDOwogICAgICAgICAgICBtYXRFW2ldW2tdID0gbWF0RVtpXVtrXSAvIEM7CiAgICAgICAgfQogICAgICAgIHZlY1hbaV0gPSB2ZWNYW2ldIC8gQzsKCiAgICAgICAgaWYgKHZlcmJvc2UpCiAgICAgICAgICAgIGR1bXAobik7CgogICAgICAgIGZvciAoayA9IDA7IGsgPCBuOyBrKyspIHsgLyog6KGM44Gu44Or44O844OXICovCiAgICAgICAgICAgIGlmIChpICE9IGspIHsKICAgICAgICAgICAgICAgIEQgPSBtYXRBW2tdW2ldOwoKICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAgICAgICAgIC8qKiBpIOWIl+ebruW+jOWNiuOBruWHpueQhiAqKi8KICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsgLyog5YiX44Gu44Or44O844OXICovCiAgICAgICAgICAgICAgICAgICAgbWF0QVtrXVtqXSA9IG1hdEFba11bal0gLSBEICogbWF0QVtpXVtqXTsKICAgICAgICAgICAgICAgICAgICBtYXRFW2tdW2pdID0gbWF0RVtrXVtqXSAtIEQgKiBtYXRFW2ldW2pdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmVjWFtrXSA9IHZlY1hba10gLSBEICogdmVjWFtpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHZlcmJvc2UpCiAgICAgICAgICAgIGR1bXAobik7CiAgICB9CgogICAgLyog6KiI566X57WQ5p6c5Ye65YqbICovCiAgICBwcmludGYoIlxuUmVzdWx0czpcbiIpOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKICAgICAgICBwcmludGYoIiAlMTIuNWxlIiwgdmVjWFtpXSk7CiAgICBwcmludGYoIlxuSW52ZXJzZTpcbiIpOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspCiAgICAgICAgICAgIHByaW50ZigiICUxMi41bGUiLCBtYXRFW2ldW2pdKTsKICAgICAgICBwcmludGYoIlxuIik7CiAgICB9CiAgICBwcmludGYoIlxuIik7Cn0K