gj.c
上传用户:bjtelijie
上传日期:2010-01-01
资源大小:87k
文件大小:1k
源码类别:

数学计算

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. int GJ(int,double **);
  5. double **TwoArrayAlloc(int,int);
  6. void TwoArrayFree(double **);
  7. void main()
  8. {
  9. int i,j,n;
  10. double **a;
  11. n=4;
  12. a=TwoArrayAlloc(n,n);
  13. a[0][0]=5; a[0][1]=7; a[0][2]=6; a[0][3]=5;
  14. a[1][0]=7; a[1][1]=10; a[1][2]=8; a[1][3]=7;
  15. a[2][0]=6; a[2][1]=8; a[2][2]=10; a[2][3]=9;
  16. a[3][0]=5; a[3][1]=7; a[3][2]=9; a[3][3]=10;
  17. if(!GJ(n,a))
  18. {
  19. printf("矩阵求逆失败n");
  20. exit(1);
  21. }
  22. printf("该矩阵的逆为:n");
  23. for(i=0;i<n;i++)
  24. {
  25. for(j=0;j<n;j++)
  26. printf("%.2ft",a[i][j]);
  27. printf("n");
  28. }
  29. }
  30. int GJ(int n,double **a)
  31. {
  32. int i,j,k;
  33. double p,q,*h;
  34. h=(double *)calloc(n,sizeof(double));
  35. if(h == NULL)
  36. {
  37. printf("内存分配失败n");
  38. exit(1);
  39. }
  40. for(k=n;k>=1;k--)
  41. {
  42. p=a[0][0];
  43. if(p<=0)
  44. {
  45. free(h);
  46. return (0);
  47. }
  48. for(i=2;i<=n;i++)
  49. {
  50. q=a[i-1][0];
  51. if(i>k)
  52. h[i-1]=q/p;
  53. else
  54. h[i-1]=-q/p;
  55. for(j=2;j<=i;j++)
  56. a[i-2][j-2]=a[i-1][j-1]+q*h[j-1];
  57. }
  58. a[n-1][n-1]=1/p;
  59. for(i=2;i<=n;i++)
  60. a[n-1][i-2]=h[i-1];
  61. }
  62. free(h);
  63. return(1);
  64. }
  65. double **TwoArrayAlloc(int r,int c)
  66. {
  67. double *x,**y;
  68. int n;
  69. x=(double *)calloc(r*c,sizeof(double));
  70. y=(double **)calloc(r,sizeof(double*));
  71. for(n=0;n<=r-1;++n)
  72. y[n]=&x[c*n];
  73. return (y);
  74. }
  75. void TwoArrayFree(double **x)
  76. {
  77. free(x[0]);
  78. free(x);
  79. }