coreBugZJ

此 blog 已弃。

高斯消元求解线性方程组——算法作业 1.1,EOJ 1040

Description

应用高斯消元法求解n*n的线性方程组Ax=b,其中A为系数矩阵。
数据保证有唯一解。

Input

第1行为一个整数n(0<n<=20),表示是n*n的的线性方程组。
接下去的n行表示了系数矩阵A,每行有n个整数。
再接下去的n行表示了b,每行只有一个整数。

Output

输出有n行,每行有1个小数(精确到0.01),表示方程组的解。

Sample Input

3
1 2 3
2 4 5
3 1 2
4
3
1

Sample Output

-1.40
-4.80
5.00



我的代码:
 1#include <stdio.h>
 2 
 3#define  L  30
 4#define  eps 0.00001
 5#define iszero(x) ( ( -eps < x ) && ( x < eps ) )
 6 
 7int gauss( double a[][ L ], double b[], int n, double x[] ) {
 8        int i, j, k;
 9        double tmp, s, t;
10        for ( k = 0; k < n; ++k ) {
11                for ( i = k; ( i < n ) && ( iszero( a[ i ][ k ] ) ); ++i )
12                        ;
13                if ( i >= n )
14                        return 0;   // -----
15                if ( i != k ) {
16                        for ( j = k; j < n; ++j ) {
17                                tmp = a[ k ][ j ];
18                                a[ k ][ j ] = a[ i ][ j ];
19                                a[ i ][ j ] = tmp;
20                        }

21                        tmp = b[ k ];
22                        b[ k ] = b[ i ];
23                        b[ i ] = tmp;
24                }

25                s = a[ k ][ k ];
26                for ( i = k + 1; i < n; ++i ) {
27                        t = a[ i ][ k ];
28                        for ( j = k; j < n; ++j ) {
29                                a[ i ][ j ] = a[ i ][ j ] * s - a[ k ][ j ] * t;
30                        }

31                        b[ i ] = b[ i ] * s - b[ k ] * t;
32                }

33        }

34        x[ n - 1 ] = b[ n - 1 ] / a[ n - 1 ][ n - 1 ];
35        for ( i = n - 2; i >= 0--i ) {
36                x[ i ] = b[ i ];
37                for ( j = i + 1; j < n; ++j ) {
38                        x[ i ] -= x[ j ] * a[ i ][ j ];
39                }

40                x[ i ] /= a[ i ][ i ];
41        }

42        return 1;
43}

44 
45int main() {
46        double a[ L ][ L ], b[ L ];
47        double x[ L ];
48        int i, j, n;
49        while ( scanf( "%d"&n ) != EOF ) {
50                for ( i = 0; i < n; ++i )
51                        for ( j = 0; j < n; ++j )
52                                scanf( "%lf"&a[ i ][ j ] );
53                for ( i = 0; i < n; ++i )
54                        scanf( "%lf"&b[ i ] );
55                gauss( a, b, n, x );
56                for ( i = 0; i < n; ++i )
57                        printf( "%0.2lf\n", x[ i ] );
58        }

59        return 0;
60}

posted on 2011-03-23 15:51 coreBugZJ 阅读(199) 评论(0)  编辑 收藏 引用 所属分类: 课内作业


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理