user-0 提问: 编程计算4*4矩阵中剩余数字

回复:
user: user-0
content: 没必要这么复杂 #include <stdio.h> #include <conio.h> int hh[4];//行和 int lh[4];//列和 int zh,fh;//主（对角线）和，副（对角线）和 int jz[4][4];//={//矩阵 //  {22,15,28,65}, //  {49, 1,21,49}, //  {53,76,16,27}, //  {33, 1,79,27}, //};   int h,l,z;//行，列，值 int yl[4];//各行中已知值所在列 int wz[4][3]={//各行未知值所在列     {0,2,3}, 	{0,1,2}, 	{0,1,3}, 	{1,2,3} }; int cs() {//测试，通过返回1，通不过返回0     int y,x,s,i;       s=0;     for (i=0;i<4;i++) {         s+=jz[i][i];     }     if (s!=zh) return 0;     s=0;     for (i=0;i<4;i++) {         s+=jz[i][4-1-i];     }     if (s!=fh) return 0; //  for (y=0;y<4;y++) { //      s=0; //      for (x=0;x<4;x++) { //          s+=jz[y][x]; //      } //      if (s!=hh[y]) return 0; //  }     for (x=0;x<4;x++) {         s=0;         for (y=0;y<4;y++) {             s+=jz[y][x];         }         if (s!=lh[x]) return 0;     }     return 1; } void xs() {//显示     int y,x;       for (y=0;y<4;y++) {         for (x=0;x<4;x++) {             printf("%3d",jz[y][x]);         }         printf("\n");     }     printf("\n"); } int main() { 	printf("输入4个行元素之和\n");     for (h=0;h<4;h++)//输入4个行元素之和 		scanf("%d",&hh[h]);  	printf("输入副对角线元素之和\n");     scanf("%d",&fh);//输入副对角线元素之和 	printf("输入4个列元素之和\n");     for (l=0;l<4;l++)//输入4个列元素之和 		scanf("%d",&lh[l]);  	printf("输入主对角线元素之和\n"); 	scanf("%d",&zh);//输入主对角线元素之和     scanf("%*d"); 	//以下输入现有的4个数字的行列号及数字 	printf("输入现有的4个数字的行列号及数字\n");     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;yl[h]=l;     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;yl[h]=l;     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;yl[h]=l;     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;yl[h]=l; //  if (cs()) { //      printf("OK\n"); //      xs(); //      return 1; //  } 	printf("开始计算\n");       for (jz[0][wz[0][0]]=0; jz[0][wz[0][0]]<hh[0]-jz[0][yl[0]]; jz[0][wz[0][0]]++) {     for (jz[0][wz[0][1]]=0; jz[0][wz[0][1]]<hh[0]-jz[0][yl[0]]-jz[0][wz[0][0]]; jz[0][wz[0][1]]++) {          jz[0][wz[0][2]]=hh[0]-jz[0][yl[0]]-jz[0][wz[0][0]]-jz[0][wz[0][1]];       for (jz[1][wz[1][0]]=0; jz[1][wz[1][0]]<hh[1]-jz[1][yl[1]]; jz[1][wz[1][0]]++) {     for (jz[1][wz[1][1]]=0; jz[1][wz[1][1]]<hh[1]-jz[1][yl[1]]-jz[1][wz[1][0]];jz[1][wz[1][1]]++) {          jz[1][wz[1][2]]=hh[1]-jz[1][yl[1]]-jz[1][wz[1][0]]-jz[1][wz[1][1]];       for (jz[2][wz[2][0]]=0; jz[2][wz[2][0]]<hh[2]-jz[2][yl[2]]; jz[2][wz[2][0]]++) {     for (jz[2][wz[2][1]]=0; jz[2][wz[2][1]]<hh[2]-jz[2][yl[2]]-jz[2][wz[2][0]]; jz[2][wz[2][1]]++) {          jz[2][wz[2][2]]=hh[2]-jz[2][yl[2]]-jz[2][wz[2][0]]-jz[2][wz[2][1]];       for (jz[3][wz[3][0]]=0; jz[3][wz[3][0]]<hh[3]-jz[3][yl[3]]; jz[3][wz[3][0]]++) {     for (jz[3][wz[3][1]]=0; jz[3][wz[3][1]]<hh[3]-jz[3][yl[3]]-jz[3][wz[3][0]]; jz[3][wz[3][1]]++) {          jz[3][wz[3][2]]=hh[3]-jz[3][yl[3]]-jz[3][wz[3][0]]-jz[3][wz[3][1]]; //      xs();getch(); //      if (kbhit()) {getch();xs();}         if (cs()) {             printf("OK\n");             xs();             return 1;         }     }} }} }} }}     printf("Can not find it!\n");     return 0; }

user: user-1
content: 仅供参考：//http://bbs.csdn.net/topics/390693018 //输入             //4×4矩阵 // 130 120 172 140 //矩阵4行元素之和 // 195             //矩阵副对角线元素之和 // 157  93 144 168 //矩阵4列元素之和 // 66              //矩阵主对角线元素之和 // 195             //重复一遍，矩阵副对角线元素之和 // 0 1 15          //(0,1)处为15 // 1 3 49          //(1,3)处为49 // 2 2 16          //(2,2)处为16 // 3 0 33          //(3,0)处为33 //编程求矩阵 //输出 // 22 15 28 65 // 49  1 21 49 // 53 76 16 27 // 33  1 79 27 #include <stdio.h> #include <conio.h> int hh[4];//行和 int lh[4];//列和 int zh,fh;//主（对角线）和，副（对角线）和 int jz[4][4];//={//矩阵 //  {22,15,28,65}, //  {49, 1,21,49}, //  {53,76,16,27}, //  {33, 1,79,27}, //}; static int bz[4][4];//标志:0未知|1已知 int h,l,z;//行，列，值 int wz[4][3]={//当前行已知值在0,1,2,3列时对应的另三个未知列     {1,2,3},     {0,2,3},     {0,1,3},     {0,1,2}, }; int yl[4];//0,1,2,3行中已知值所在列 int cs() {//测试，通过返回1，通不过返回0     int y,x,s,i;      s=0;     for (i=0;i<4;i++) {         s+=jz[i][i];     }     if (s!=zh) return 0;     s=0;     for (i=0;i<4;i++) {         s+=jz[i][4-1-i];     }     if (s!=fh) return 0; //  for (y=0;y<4;y++) { //      s=0; //      for (x=0;x<4;x++) { //          s+=jz[y][x]; //      } //      if (s!=hh[y]) return 0; //  }     for (x=0;x<4;x++) {         s=0;         for (y=0;y<4;y++) {             s+=jz[y][x];         }         if (s!=lh[x]) return 0;     }     return 1; } void xs() {//显示     int y,x;      for (y=0;y<4;y++) {         for (x=0;x<4;x++) {             printf("%3d",jz[y][x]);         }         printf("\n");     }     printf("\n"); } int main() {     for (h=0;h<4;h++) scanf("%d",&hh[h]);     scanf("%d",&fh);     for (l=0;l<4;l++) scanf("%d",&lh[l]);     scanf("%d",&zh);     scanf("%*d");     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;bz[h][l]=1;yl[h]=l;     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;bz[h][l]=1;yl[h]=l;     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;bz[h][l]=1;yl[h]=l;     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;bz[h][l]=1;yl[h]=l; //  if (cs()) { //      printf("OK\n"); //      xs(); //      return 1; //  }      for (jz[0][wz[yl[0]][0]]=0; jz[0][wz[yl[0]][0]]<hh[0]-jz[0][yl[0]]                                        ; jz[0][wz[yl[0]][0]]++) {     for (jz[0][wz[yl[0]][1]]=0; jz[0][wz[yl[0]][1]]<hh[0]-jz[0][yl[0]]-jz[0][wz[yl[0]][0]]                    ; jz[0][wz[yl[0]][1]]++) {          jz[0][wz[yl[0]][2]]=                       hh[0]-jz[0][yl[0]]-jz[0][wz[yl[0]][0]]-jz[0][wz[yl[0]][1]];      for (jz[1][wz[yl[1]][0]]=0; jz[1][wz[yl[1]][0]]<hh[1]-jz[1][yl[1]]                                        ; jz[1][wz[yl[1]][0]]++) {     for (jz[1][wz[yl[1]][1]]=0; jz[1][wz[yl[1]][1]]<hh[1]-jz[1][yl[1]]-jz[1][wz[yl[1]][0]]                    ; jz[1][wz[yl[1]][1]]++) {          jz[1][wz[yl[1]][2]]=                       hh[1]-jz[1][yl[1]]-jz[1][wz[yl[1]][0]]-jz[1][wz[yl[1]][1]];      for (jz[2][wz[yl[2]][0]]=0; jz[2][wz[yl[2]][0]]<hh[2]-jz[2][yl[2]]                                        ; jz[2][wz[yl[2]][0]]++) {     for (jz[2][wz[yl[2]][1]]=0; jz[2][wz[yl[2]][1]]<hh[2]-jz[2][yl[2]]-jz[2][wz[yl[2]][0]]                    ; jz[2][wz[yl[2]][1]]++) {          jz[2][wz[yl[2]][2]]=                       hh[2]-jz[2][yl[2]]-jz[2][wz[yl[2]][0]]-jz[2][wz[yl[2]][1]];      for (jz[3][wz[yl[3]][0]]=0; jz[3][wz[yl[3]][0]]<hh[3]-jz[3][yl[3]]                                        ; jz[3][wz[yl[3]][0]]++) {     for (jz[3][wz[yl[3]][1]]=0; jz[3][wz[yl[3]][1]]<hh[3]-jz[3][yl[3]]-jz[3][wz[yl[3]][0]]                    ; jz[3][wz[yl[3]][1]]++) {          jz[3][wz[yl[3]][2]]=                       hh[3]-jz[3][yl[3]]-jz[3][wz[yl[3]][0]]-jz[3][wz[yl[3]][1]]; //      xs();getch(); //      if (kbhit()) {getch();xs();}         if (cs()) {             printf("OK\n");             xs();             return 1;         }     }} }} }} }}     printf("Can not find it!\n");     return 0; }

user: user-2
content: 而且可能是不定方程

user: user-2
content: 这是 解方程啊 要解n元一次方程组

user: user-3
content: 把不知道的数全部设置成不同未知变量，然后列出所有方程求解，求解方程组的解