fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define M 8
  5. #define N 9
  6.  
  7. /* 連立方程式を解くガウス・ジョルダン法のプログラム
  8.  ただし、「ガウス・ジョルダン法を使え」と言ってるのではなく、
  9. 連立方程式を解くアルゴリズムなら何を使ってもいい */
  10. void gause_jordan(double A[][N]) {
  11. double p, d;
  12. for (size_t i = 0; i < M; i++) {
  13. p = A[i][i];
  14. for (size_t j = 0; j < N; j++) {
  15. A[i][j] = A[i][j] / p;
  16. }
  17. for (size_t j = 0; j < M; j++) {
  18. if (i != j) {
  19. d = A[j][i];
  20.  
  21. for (size_t k = i; k < N; k++) {
  22. A[j][k] = A[j][k] - d * A[i][k];
  23. }
  24. }
  25. }
  26. }
  27. }
  28.  
  29. int main(void) {
  30. /* printf の第一引数に与えるフォーマット文字列をテンプレとして定義。
  31.   何も必ずしも for 文で回しながら5行5列の行列印字を成し遂げなくてもいい。 */
  32. char* template = " 300 300 300 300 300\n 300 %4.0lf %4.0lf %4.0lf 300\n 300 %4.0lf 1200 %4.0lf 300\n 300 %4.0lf %4.0lf %4.0lf 300\n 300 300 300 300 300\n";
  33. /* 問題の行列は double 型にした方がいいだろう。 */
  34. double mat[M][N] = {{4., -1., 0., -1., 0., 0., 0., 0., 600.},
  35. {-1., 4., -1., 0., 0., 0., 0., 0., 1500.},
  36. {0., -1., 4., 0., -1., 0., 0., 0., 600.},
  37. {-1., 0., 0., 4., 0., -1., 0., 0., 1500.},
  38. {0., 0., -1., 0., 4., 0., 0., -1., 1500.},
  39. {0., 0., 0., -1., 0., 4., -1., 0., 600.},
  40. {0., 0., 0., 0., 0., -1., 4., -1., 1500.},
  41. {0., 0., 0., 0., -1., 0., -1., 4., 600.}};
  42. /* 設定行列にガウス・ジョルダン法を適用 */
  43. gause_jordan(mat);
  44. /* 解の配列。
  45.   ガウス・ジョルダン法で処理したら行列のN列目が解のベクトルになる。*/
  46. double answer[M];
  47. for (size_t i = 0; i < M; i++) {
  48. answer[i] = mat[i][N - 1];
  49. }
  50. /* あとは、テンプレ文字列に answer 配列の要素を順次はめ込んでいけばいい。 */
  51. printf(template, answer[0], answer[1], answer[2], answer[3], answer[4], answer[5], answer[6], answer[7]);
  52. return EXIT_SUCCESS;
  53. }
  54.  
Success #stdin #stdout 0.01s 5304KB
stdin
Standard input is empty
stdout
 300  300  300  300  300
 300  450  600  450  300
 300  600 1200  600  300
 300  450  600  450  300
 300  300  300  300  300