zoukankan      html  css  js  c++  java
  • 高斯消元板子

    #include<bits/stdc++.h>
    #define re register int
    #define D double
    using namespace std;
    int n,J;
    D a[600][600],x[600];
    void solve()
    {
    	int h=1,l=1;
    	for(;(h<=n)&&(l<=n);h++,l++)
    	{
    		int maxx=h;
    		for(re j=h+1;j<=n;j++)
    			if(fabs(a[j][l])>fabs(a[maxx][l]))
    				maxx=j;
    		if(maxx!=h)
    			swap(a[h],a[maxx]);
    		if(!a[h][l])
    		{
    			--h;
    			continue;
    		}
    		for(re j=h+1;j<=n;j++)
    		{
    			D tem=a[j][l]/a[h][l];
    			for(re k=l;k<=n+1;k++)
    				a[j][k]-=a[h][k]*tem;
    		}
    	}
    	for(re i=h;i<=n;i++)
    		if(a[i][n+1]!=0)
    		{
    			J=-1;
    			return;
    		}
    	if(h<=n)
    		J=-2;
    }
    int main()
    {
    	scanf("%d",&n);
    	for(re i=1;i<=n;i++)
    		for(re j=1;j<=n+1;j++)
    			scanf("%lf",&a[i][j]);
    	solve();
    	if(J==-1)
    	{
    		printf("-1\n");
    		return 0;
    	}
    	if(J==-2)
    	{
    		printf("0\n");
    		return 0;
    	}
    	for(re i=n;i>0;i--)
    	{
    		D ans=a[i][n+1];
    		for(re j=n;j>i;j--)
    			ans-=a[i][j]*x[j];
    		x[i]=ans/a[i][i];
    	}
    	for(re i=1;i<=n;i++)
    	{
    		if(x[i]==0)
    			printf("x%d=0\n",i);
    		else
    			printf("x%d=%.2lf\n",i,x[i]);
    	}
    	return 0;
    }
    

    2.相对简单,但不能判断无解

    
    
    #include<bits/stdc++.h>
    #define re register int
    #define D double
    using namespace std;
    int n,J;
    D a[600][600];
    void solve()
    {
    	for(re i=1;i<=n;i++)
    	{
    		int maxx=i;
    		for(re j=i+1;j<=n;j++)
    		{
    			if(fabs(a[j][i])>fabs(a[maxx][i]))
    				maxx=j;
    		}
    		if(maxx!=i)
    			swap(a[i],a[maxx]);
    		for(re j=1;j<=n;j++)
    		{
    			if(j==i)
    				continue;
    			D tem;
    			if(!a[i][i])
    				tem=0;
    			else
    				tem=a[j][i]/a[i][i];
    			for(re k=i+1;k<=n+1;k++)
    				a[j][k]-=a[i][k]*tem;
    		}
    	}
    }
    int main()
    {
    	scanf("%d",&n);
    	for(re i=1;i<=n;i++)
    		for(re j=1;j<=n+1;j++)
    			scanf("%lf",&a[i][j]);
    	solve();
    	for(re i=1;i<=n;i++)
    	{
    		D ans=a[i][n+1]/a[i][i];
    		if(ans==0)
    			printf("x%d=0\n",i);
    		else
    			printf("x%d=%.2lf\n",i,ans);
    	}
    	return 0;
    }
  • 相关阅读:
    Windows下_findnext()异常问题
    Windows 10正式版官方原版镜像!(备忘)
    qt中出现error: C2059: 语法错误:“namespace”未定义等大量错误的问题
    linux shell的简单思维导图
    高仿花生壳客户端程序(qt)
    公告
    修改注册表自定义键盘快捷键
    斜率优化
    元旦老人与丛林
    CF 1466G Song of the Sirens
  • 原文地址:https://www.cnblogs.com/WindZR/p/14752134.html
Copyright © 2011-2022 走看看