Vijos 1052 贾老二算算术

来源:互联网 发布:手机阻拦广告软件 编辑:程序博客网 时间:2024/05/16 16:18

难度:*


大意:解n元一次方程组
输入:
第一行一个n,表示是n元的方程组
以下n行,每行n+1个数,前n个数分别表示系数,最后一个表示结果
输出:
第一行n个数,表示方程的解


板块:数学
数据结构:——
算法:高斯消元法


分析:用高斯消元法即可解决

时间复杂度:O(n^3)



代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
double f[101][102],ans[101];
int n;
double get(double i)
{
return i>0?i:-i;
}
void swap(int i,int j)
{
int k;
double tmp[102];
for (k=1;k<=n+1;k++) tmp[k]=f[i][k];
for (k=1;k<=n+1;k++) f[i][k]=f[j][k];
for (k=1;k<=n+1;k++) f[j][k]=tmp[k];
}
void gauss(void)
{
int i,j,k;
double r;
for (i=1;i<n;i++)
{
for (j=i+1;j<=n;j++)
 if (get(f[i][i])<get(f[j][i])) swap(i,j);
for (j=i+1;j<=n;j++)
 if (f[j][i]!=0)
 {
  r=f[i][i]/f[j][i];
  for (k=i;k<=n+1;k++) f[j][k]=f[i][k]-r*f[j][k];
 }
}
ans[n]=f[n][n+1]/f[n][n];
for (i=n-1;i>0;i--)
{
for (j=n;j>i;j--) f[i][n+1]-=f[i][j]*ans[j];
ans[i]=f[i][n+1]/f[i][i];
}
for (i=1;i<=n;i++) printf("%d ",(int)(ans[i]+0.5+1e-6));
printf("\n");
}
int main(void)
{
int i,j;
scanf("%d",&n);
for (i=1;i<=n;i++)
 for (j=1;j<=n+1;j++) scanf("%lf",&f[i][j]);
gauss();
return 0;
}


总结:
1、细节类
·输出保留整数的浮点数:printf("%d",(int)(ans[i]+0.5+1e-6));
0 0
原创粉丝点击