鱼C论坛

 找回密码
 立即注册
查看: 2325|回复: 1

[已解决]C语言解N元方程组

[复制链接]
发表于 2019-4-13 16:21:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
给定n×n的矩阵 A=aij,和n×1的列向量B=bi,求列向量X=xi, 使得AX=B
保证方程有唯一解

输入描述

第一行一个数n,表示方程的个数和未知数的个数。

接下来n行,每行n+1个数(可能为小数)。前n个为x1...xn的参数,最后一个为bi

输出描述(保证有唯一解)

n行,每行一个数,表示xi

样例输入

3
1 2 3 4
1 3 4 5
1 2 4 233

样例输出

-227.000000
-228.000000
229.000000


最佳答案
2019-4-13 21:24:22
本帖最后由 Croper 于 2019-4-13 21:32 编辑

线代都忘光了。。

先拿初中的解法写一个吧。。一会复习线代去。。。
  1. #include <stdio.h>

  2. #ifndef _out_
  3. #define _out_
  4. #endif

  5. int FormulaSolve(double** M,int N,double* _out_ ret){
  6.         //当方程只有一个未知数,即方程的形式为ax=b时
  7.         //printMatrix(M,N);
  8.        
  9.         if (N==1){  
  10.                 double* f=M[0];            
  11.                 if (f[0]==0. && f[1]!=0.){            //ax=b的方程,当a==0,b!=0时,方程无解
  12.                         return -1;
  13.                 }
  14.                
  15.                 ret[0]=0.;                              
  16.                 if (f[0]!=0.) ret[0]=f[1]/f[0];     //ax=b的根为x=b/a;
  17.                 return 1;
  18.         }
  19.        
  20.         //当方程的未知数数目大于1时,消元
  21.         //寻找一个未知数[0]的系数不为0的方程,用其他方程减去t倍的第一个方程,以消去其他方程的未知数[0]
  22.        
  23.         //第一步,寻找一个未知数[0]的系数不为0的方程,并把其他方程存入矩阵M2中;
  24.         int i,j;
  25.         double* f=NULL;
  26.         double *M2[N];  //这里大小为N是为了在方程无解时避免跳出溢出错误,方程一定有解时大小可设为N-1
  27.         j=0;
  28.         for (i=0;i<N;++i){
  29.                 if (f==NULL && M[i][0]!=0.){
  30.                         f=M[i];
  31.                         continue;
  32.                 }
  33.                 M2[j++]=M[i];
  34.         }
  35.         if (f==NULL) return -1;

  36.         //第二部,消去M2中的方程的未知数[0]
  37.         for (i=0;i<N-1;++i){
  38.                 double* fn=M2[i];
  39.                 double t=fn[0]/f[0];

  40.                 for (j=1;j<N+1;++j){
  41.                         fn[j]-=t*f[j];
  42.                 }
  43.                 M2[i]++;                      //去除第一个未知数的项
  44.         }

  45.         //第三步:计算M2的结果
  46.         int hr= FormulaSolve(M2,N-1,ret+1);
  47.         if (hr==-1) return -1;
  48.        
  49.         //第四步:通过M2的结果反推出未知数[0]的值
  50.         for (i=1;i<N;++i){
  51.                 f[N]-=f[i]*ret[i];
  52.         };
  53.         ret[0]=f[N]/f[0];
  54.         return 1;
  55. }


  56. int main(){
  57.         int N;
  58.         scanf("%d",&N);
  59.         double *M[N];
  60.         int i,j;
  61.         for (i=0;i<N;++i){
  62.                 M[i]=(double*)malloc(sizeof(double)*(N+1));
  63.                 for (j=0;j<N+1;++j){
  64.                         scanf("%lf",&(M[i][j]));
  65.                 }
  66.         }
  67.        
  68.         double ret[N];
  69.         int hr=FormulaSolve(M,N,ret);
  70.         if (hr==-1){
  71.                 printf("方程无解");
  72.         }
  73.         else{
  74.                 for (i=0;i<N;++i){
  75.                         printf("%lf ",ret[i]);
  76.                 }
  77.         }       
  78. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-4-13 21:24:22 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Croper 于 2019-4-13 21:32 编辑

线代都忘光了。。

先拿初中的解法写一个吧。。一会复习线代去。。。
  1. #include <stdio.h>

  2. #ifndef _out_
  3. #define _out_
  4. #endif

  5. int FormulaSolve(double** M,int N,double* _out_ ret){
  6.         //当方程只有一个未知数,即方程的形式为ax=b时
  7.         //printMatrix(M,N);
  8.        
  9.         if (N==1){  
  10.                 double* f=M[0];            
  11.                 if (f[0]==0. && f[1]!=0.){            //ax=b的方程,当a==0,b!=0时,方程无解
  12.                         return -1;
  13.                 }
  14.                
  15.                 ret[0]=0.;                              
  16.                 if (f[0]!=0.) ret[0]=f[1]/f[0];     //ax=b的根为x=b/a;
  17.                 return 1;
  18.         }
  19.        
  20.         //当方程的未知数数目大于1时,消元
  21.         //寻找一个未知数[0]的系数不为0的方程,用其他方程减去t倍的第一个方程,以消去其他方程的未知数[0]
  22.        
  23.         //第一步,寻找一个未知数[0]的系数不为0的方程,并把其他方程存入矩阵M2中;
  24.         int i,j;
  25.         double* f=NULL;
  26.         double *M2[N];  //这里大小为N是为了在方程无解时避免跳出溢出错误,方程一定有解时大小可设为N-1
  27.         j=0;
  28.         for (i=0;i<N;++i){
  29.                 if (f==NULL && M[i][0]!=0.){
  30.                         f=M[i];
  31.                         continue;
  32.                 }
  33.                 M2[j++]=M[i];
  34.         }
  35.         if (f==NULL) return -1;

  36.         //第二部,消去M2中的方程的未知数[0]
  37.         for (i=0;i<N-1;++i){
  38.                 double* fn=M2[i];
  39.                 double t=fn[0]/f[0];

  40.                 for (j=1;j<N+1;++j){
  41.                         fn[j]-=t*f[j];
  42.                 }
  43.                 M2[i]++;                      //去除第一个未知数的项
  44.         }

  45.         //第三步:计算M2的结果
  46.         int hr= FormulaSolve(M2,N-1,ret+1);
  47.         if (hr==-1) return -1;
  48.        
  49.         //第四步:通过M2的结果反推出未知数[0]的值
  50.         for (i=1;i<N;++i){
  51.                 f[N]-=f[i]*ret[i];
  52.         };
  53.         ret[0]=f[N]/f[0];
  54.         return 1;
  55. }


  56. int main(){
  57.         int N;
  58.         scanf("%d",&N);
  59.         double *M[N];
  60.         int i,j;
  61.         for (i=0;i<N;++i){
  62.                 M[i]=(double*)malloc(sizeof(double)*(N+1));
  63.                 for (j=0;j<N+1;++j){
  64.                         scanf("%lf",&(M[i][j]));
  65.                 }
  66.         }
  67.        
  68.         double ret[N];
  69.         int hr=FormulaSolve(M,N,ret);
  70.         if (hr==-1){
  71.                 printf("方程无解");
  72.         }
  73.         else{
  74.                 for (i=0;i<N;++i){
  75.                         printf("%lf ",ret[i]);
  76.                 }
  77.         }       
  78. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-7 11:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表