자바 - 522 개 434 228 213 문자
작동 가능한 것을 찾을 때까지 직접 곱셈으로 가능한 모든 정수 n- 튜플을 체계적으로 검사하여 해결합니다.
함수는 증강 행렬, A, 시험 솔루션 벡터, x 및 차원 n을 입력으로 사용합니다-솔루션 벡터 x를 출력합니다. 벡터 x는 실제로 가능한 솔루션을 단계별로 진행하는 데 도움이되는 치수보다 하나 더 큽니다. (변수 A, x, n, j, k, s를 인스턴스 변수로 선언하면 함수는 31 자 더 짧아 지지만 총 182 개이지만 규칙을 너무 세게 구부리는 것처럼 느껴집니다.)
int[]Z(int[][]A,int[]x,int n){int j,k,s;for(;;){for(j=0;j<n;j++){for(k=s=0;k<n;s+=A[j][k]*x[k++]);if(s!=A[j][n])j+=n;}if(j==n)return x;for(j=0;j<=n;j++)if(x[j]!=x[n]||j==n){x[j]++;for(k=0;k<j;x[k++]=-x[n]);j=n;}}}
테스트를위한 프로그램
import java.util.*;
class MatrixSolver{
public MatrixSolver() {
Scanner p=new Scanner(System.in); //initialize everything from stdin
int j,k,n=p.nextInt(),A[][]=new int[n][n+1],x[]=new int[n+1];
for(j=0;j<n;j++)for(k=0;k<=n;A[j][k++]=p.nextInt());
x=Z(A,x,n); //call the magic function
for(j=0;j<n;j++) System.out.print(x[j]+" "); //print the output
}
public static void main(String[]args){
new MatrixSolver();
}
int[]Z(int[][]A,int[]x,int n){
int j,k,s;
for(;;){
for(j=0;j<n;j++){ //multiply each row of matrix by trial solution and check to see if it is correct
for(k=s=0;k<n;s+=A[j][k]*x[k++]);
if(s!=A[j][n])j+=n;
}
if(j==n)return x; //if it is correct return the trial solution
for(j=0;j<=n;j++)if(x[j]!=x[n]||j==n){//calculate the next trial solution
x[j]++;
for(k=0;k<j;x[k++]=-x[n]);
j=n;
}
}
}
}
프로그램은 stdin에서 다음과 같이 공백으로 구분 된 정수로 입력을받습니다. 첫째, 문제의 차원, 둘째, 증가 된 행렬의 항목을 행으로 입력합니다.
샘플 실행 :
$java -jar MatrixSolver.jar
3 2 1 -1 8 -3 -1 2 -11 -2 1 2 -3
2 3 -1
루프와 "공개"에 대한 Victor의 조언을 따르고 RHS를 별도가 아닌 확장 된 매트릭스에 저장하고 시험 솔루션에 추가 항목을 추가하여 각 새로운 시험 솔루션의 생성을 단순화함으로써 여러 문자를 면도했습니다. OP는 또한 기능이 충분하다고 말했다. 전체 프로그램을 세지 않아도된다.