고스 소원법 (약당 소원법)

3927 단어
이것은 정말 나를 오랫동안 귀찮게 했다. 아마도 내가 너무 멍청했기 때문일 것이다. 마지막으로 몇 개의 틀을 보고 오랫동안 썼는데, 마침내 나는 이해하게 되었다.코드를 구체적으로 보세요. 이것은 0인지 아닌지를 직접 판단하는 것이고 정밀도는 거의 없습니다.
#include
#include
#include
#include
#include
using namespace std;
double a[128][128];
int m,n;
int cmp(double x, double y)
{
    double v=fabs(x-y);
    if(v>1e-6)  return 1;
    else return 0;
}
void pf()
{
    int i,j;
    printf("-----------------------
"); for(i=1; i<=m; i++) { for(j=1; j<=n; j++){ printf("%5.1f ",a[i][j]); } printf("
"); } } void solve() { int i,j,k; for(i=1; i<=m; i++){ if(cmp(a[i][i],0)==0){ for(j=i+1; j<=m; j++){ if(cmp(a[j][i],0)==1) break; } for(k=1; k<=n; k++) swap(a[i][k],a[j][k]); } for(j=n; j>=i; j--){// , i , . for(k=1; k<=m; k++) { if(k!=i){ a[k][j]-=(a[k][i]/a[i][i]*a[i][j]);// !// , , . } } } } for(i=1; i<=m; i++) { for(j=n;j>=i;j--) { a[i][j]/=a[i][i];// } } } int main() { int i,j; scanf("%d%d",&m,&n); for(i=1; i<=m; i++) { for(j=1; j<=n; j++) { scanf("%lf",&a[i][j]); } } solve(); //pf();// }

이 정밀도는 요구가 있기 때문에 가능한 한 이 열에서 비교적 큰 숫자를 선택하고 새로 추가된 판단 0의 숫자는 제목에 따라 행렬의 질을 구할 수 있다.잘 생각해봐요.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define CLR(x) memset(x,0,sizeof(x))
#define ll long long int
#define db double
using namespace std;
const int maxn=205;
const ll inf=1e15+5;
const int INF = 1e8 + 5;
const int mod=1e9 + 7;
const db EPS=1e-2;
double a[205][205];
int vis[205];//    0    .
int m,n,cnt=0;
int cmp(db x, db y)
{
    db v;
    v=abs(x-y);
    if(v>=EPS)return 1;
    return 0;
}

void debug()
{
    printf("-----------------------
"); for(int i=1; i<=m; i++){ for(int j=1; j<=n; j++){ printf("%5.1f ",a[i][j]); } printf("
"); } } void solve() { int sj,flag; db maxx; CLR(vis); for(int i=1; i<=m; i++){ flag=0; maxx=-inf; for(int j=i; j<=m; j++){ if(a[j][i]>maxx&&cmp(a[j][i],0)){ sj=j;// maxx=a[j][i]; flag=1; } } if(!flag){ vis[i]=1;// , ( ). cnt++;// continue; } for(int k=1; k<=n; k++) swap(a[i][k],a[sj][k]); for(int j=n; j>=i; j--){// , i , . if(vis[j]) continue;// a[i]][i] . for(int k=1; k<=m; k++) { if(k!=i){ a[k][j]-=(a[k][i]/a[i][i]*a[i][j]);// !// , , . } } } } for(int i=1; i<=m; i++){ if(!allzero[i]){ for(int j=n;j>=0;j--){ a[i][j]/=a[i][i]; } } } } int main() { int i,j; scanf("%d%d",&m,&n); for(i=1; i<=m; i++){ for(j=1; j<=n; j++){ scanf("%lf",&a[i][j]); } } solve(); //debug(); int p=m-cnt; if(p>=0) printf("%d
",p); else printf("-1
"); }

좋은 웹페이지 즐겨찾기