算法复习——高斯消元(ssoi)

题目:

题目描述

Tom 是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面。虽然他解决 2x=2 这样的方程游刃有余,但是对于下面这样的方程组就束手无策了。
x+y=3
x-y=1
于是他要你来帮忙。给定一个线性多元一次方程组,请你求出所有未知数的解。
保证在 int 范围内可以处理所有问题。

输入格式

输入文件的第一行一个数字 N(1≤N≤100),表示给定的方程组中的未知数的个数,同时也是这个方程组含有的方程个数。
第 2 到 N+1 行,每行 N+1 个数。每行的前 N 个数表示第 1 到 N 个未知数的系数。第 N+1 个数表示 N 个未知数乘以各自系数后再相加的和。

输出格式

输出一行,有 N 个整数,表示第 1 到 N 个未知数的值(整数解),而且数据保证有整数解。

样例数据 1

输入  [复制]


1 1 3 
1 -1 1

输出

      2 1

题解:

高斯消元模板题,具体过程见:http://jingyan.baidu.com/album/39810a23e40c80b636fda63a.html?picindex=1

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
double map[105][105],ans[105];
int n;
int main()
{
  //freopen("a.in","r",stdin);
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
    for(int j=1;j<=n+1;j++)
      scanf("%lf",&map[i][j]);
  for(int i=1;i<=n;i++)
  {
    bool flag=false;
    if(!map[i][i])
    {
      for(int j=i+1;j<=n;j++)
        if(map[j][i])
        {
          flag=true;
          for(int k=i;k<=n+1;k++)
            swap(map[j][k],map[i][k]);
        } 
      if(flag==false)  continue;
    }
    for(int j=i+1;j<=n;j++)
    {  
      double temp=map[j][i]/map[i][i];
      for(int k=i;k<=n+1;k++)
        map[j][k]-=temp*map[i][k];
    }
  }
  for(int i=n;i>=1;i--)
  {
    ans[i]=map[i][n+1]/map[i][i];
    for(int j=i-1;j>=1;j--)
      map[j][n+1]-=map[j][i]*ans[i];
  }
  for(int i=1;i<=n;i++)
    cout<<(int)(ans[i]+0.5)<<' ';
  return 0;
}

 

 

 

posted @ 2017-07-27 17:07  AseanA  阅读(289)  评论(0编辑  收藏  举报