70 条题解
-
0Glocklee LV 3 @ 2006-11-21 22:03:57
精度,精度。。。输出的时候要处理。。。
-
02006-11-21 12:24:17@
什么是高斯消元法?哪位大牛能指导一下,感激不尽!
-
02006-11-06 16:57:10@
晕...终于过了...
就是个找每列最大值里..可能是负数...不是0///无奈了. -
02006-11-15 19:57:04@
每次把首项绝对值最大的行与当前行交换
-
02006-07-19 11:20:02@
就是一个简单的高斯消元解线性方程的问题吗
-
02006-03-17 22:56:57@
要注意系数为0的情况
-
02006-01-26 09:56:21@
标准高斯消元
特殊情况都免了 -
-12016-12-06 20:28:54@
AC代码 C语言
#include<stdio.h>
int n;
double f[102][102];
double num[102];
void swap(int a,int b)
{
for(int i=1;i<=n+1;i++)
{
double t=f[a][i];
f[a][i]=f[b][i];
f[b][i]=t;
}
}
double fabs(double a)
{
return a>0?a:(-a);
}
int main()
{
scanf("%d",&n);
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
{
int temp;
scanf("%d",&temp);
f[i][j]=(double)temp;
}
}
for(i=1;i<=n;i++)
{
int pos;
double max=0.0;
for(j=i;j<=n;j++)
{
if(max<fabs(f[j][i]))
{
max=fabs(f[j][i]);
pos=j;
}
}
if(max-0.0<1e-5) continue;
swap(pos,i);
for(j=i+1;j<=n;j++)
{
if(fabs(f[j][i]-0.0)<1e-5) continue;
double t=fabs(f[i][i]/f[j][i]);
if(f[i][i]*f[j][i]>0)
{
for(k=i;k<=n+1;k++)
{
f[j][k]=f[j][k]*t-f[i][k];
}
}
else
{
for(k=i;k<=n+1;k++)
{
f[j][k]=f[j][k]*t+f[i][k];
}
}
}
}
for(i=n;i>=1;i--)
{
double sum=f[i][n+1];
for(j=n;j>i;j--)
{
sum-=f[i][j]*num[j];
}
num[i]=sum/f[i][i];
}
for(i=1;i<=n;i++)
{
printf("%d ",(int)(num[i]+0.5));
}
return 0;
}
-
-12016-12-06 20:26:52@
AC代码 C
#include<stdio.h>
int n;
double f[102][102];
double num[102];
void swap(int a,int b)
{
for(int i=1;i<=n+1;i++)
{
double t=f[a][i];
f[a][i]=f[b][i];
f[b][i]=t;
}
}
double fabs(double a)
{
return a>0?a:(-a);
}
int main()
{
scanf("%d",&n);
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
{
int temp;
scanf("%d",&temp);
f[i][j]=(double)temp;
}
}
for(i=1;i<=n;i++)
{
int pos;
double max=0.0;
for(j=i;j<=n;j++)
{
if(max<fabs(f[j][i]))
{
max=fabs(f[j][i]);
pos=j;
}
}
if(max-0.0<1e-5) continue;
swap(pos,i);
for(j=i+1;j<=n;j++)
{
if(fabs(f[j][i]-0.0)<1e-5) continue;
double t=fabs(f[i][i]/f[j][i]);
if(f[i][i]*f[j][i]>0)
{
for(k=i;k<=n+1;k++)
{
f[j][k]=f[j][k]*t-f[i][k];
}
}
else
{
for(k=i;k<=n+1;k++)
{
f[j][k]=f[j][k]*t+f[i][k];
}
}
}
}
for(i=n;i>=1;i--)
{
double sum=f[i][n+1];
for(j=n;j>i;j--)
{
sum-=f[i][j]*num[j];
}
num[i]=sum/f[i][i];
}
for(i=1;i<=n;i++)
{
printf("%d ",(int)(num[i]+0.5));
}
return 0;
}
/*2
1 1 3
1 -1 1*/
-
-12015-10-29 18:50:07@
高斯消元 每次消要记得把绝对值最大的调上来,否则可能出现被0除的情况
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
double equ[110][110],ans[110];
int n;
void work(){
for(int i=1;i<n;i++){//消掉第i个未知数
int maxi=i;
for(int t=i;t<=n;t++) if(fabs(equ[t][i]) > fabs(equ[maxi][i])) maxi=t;
for(int t=1;t<=n+1;t++) swap(equ[maxi][t],equ[i][t]);
for(int j=i+1;j<=n;j++){//消第j个方程
double t=equ[j][i]/equ[i][i];
for(int k=i;k<=n+1;k++){
equ[j][k]-=t*equ[i][k];
}
}
}
for(int i=n;i>=1;i--){//回代第i个
for(int j=n;j>i;j--){
equ[i][n+1]-=equ[i][j]*ans[j];
}
ans[i]=equ[i][n+1]/equ[i][i];
}
}int main(){
//freopen("1052.in","r",stdin);freopen("1052.out","w",stdout);
scanf("%d",&n);
for(int j=1;j<=n;j++)
for(int i=1;i<=n+1;i++)
scanf("%lf",&equ[j][i]);
work();
for(int i=1;i<=n;i++) printf("%d ",int(ans[i]+0.5));
return 0;
}