VIJOS 1052贾老二算算术 (高斯消元)

描述

贾老二是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面。虽然他解决 2x=2 这样的方程游刃有余,但是对于 {x+y=3 x-y=1} 这样的方程组就束手无策了。于是他要你来帮忙。前提是一次方程组且保证在integer的范围内可以处理所有问题。

格式

输入格式

第一行一个数字N(1≤N≤100)表示要求的未知数的个数,同时也是所给的方程个数。

第2到N+1行,每行N+1个数。前N个表示第1到N个未知数的系数。第N+1个数表示N个未知数乘以各自系数后的加和。(保证有唯一整数解)

输出格式

一行N个数,表示第1到N个未知数的值。

 

模板题!

 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 double a[2005][2005];
 7 int n;
 8 int gcd(int a,int b){
 9     if (b==0) return a;
10     else return gcd(b,a%b);
11 }
12 void gauss(){
13     int now=1,to,ggcd;
14     double t;
15     for (int i=1;i<=n;i++){
16         for (to=now;to<=n;to++) if (a[to][i]!=0) break;
17         if (to>n) continue;
18         if (to!=now) for (int j=1;j<=n+1;j++) std::swap(a[to][j],a[now][j]);
19         t=a[now][i];
20         for (int j=1;j<=n+1;j++) a[now][j]/=t;
21         for (int j=1;j<=n;j++)
22          if (j!=now){
23                 t=a[j][i];
24                 for (int k=1;k<=n+1;k++)
25                  a[j][k]-=t*a[now][k];
26          }
27         now++;  
28     }
29 }
30 int main(){
31     scanf("%d",&n);
32     for (int i=1;i<=n;i++){
33         for (int j=1;j<=n+1;j++)
34          scanf("%lf",&a[i][j]);
35     }
36     gauss();
37     for (int i=1;i<=n;i++)
38      printf("%d ",(int)round(a[i][n+1]));
39 }

 

posted @ 2016-05-30 21:26  GFY  阅读(446)  评论(0编辑  收藏  举报