C语言三阶幻方求解.doc
三阶幻方.cpp : Defines the entry point for the console application./* 操作系统:Windows XP * 编译环境:Microsoft Visual C+6.0 * * 程序编写:万传华 * 联系邮箱:wanchuanhuasina.com */求解幻方/ a b c/ d e f/ g h i/a+e+i=15/b+e+h=15/c+e+g=15/d+e+f=15/-(a+b+c+d)+(i+h+g+f)+4*e=60/-(a+b+c+d+e+f+g+h+i)+3*e=60/-3*15+3*e=60/-e=5/f=15-e-d=10-d,g=15-e-c=10-c=10-(15-a-b)=a+b-5,/h=15-e-b=10-b,i=15-e-a=10-a,/a+d+g=15/a+d+(15-c-e)=15/a+d+(15-(15-a-b)-5)=15/2*a+b+d=20/同理2*c+b+f=20,2*g+d+h=20,2*i+f+h=20/用a、b两个未知数可解其它/ a b 15-a-b/20-2*a-b 5 2*a+b-10/a+b-5 10-b 10-a/需要检验/1.数字是否重复/2.数字范围1,9/a,b,5,(15-a-b),(20-2*a-b),(2*a+b-10),(a+b-5),(10-b),(10-a)两两不等-/ab,a5,b5,a+b10,2*a+b15,a+2*b15,3*a+b20,3*a+2*b25/1=a=9,1=b=9,1=15-a-b=9,1=20-2*a-b=9,1=2*a+b-10=9,1=a+b-5=9,1=10-b=9,1=10-a=9 -/1=a=9,1=b=9,6=a+b=14,11=2*a+b=19/假如a=1,根据11=2*a+b=19,1=b=9,9=a+b=14,可得b=9,可是a+b10,故b无解/假如a=2,b=7或者9,满足所有条件/./#include stdafx.h#include stdio.h#include stdlib.h#include conio.hvoid test()int i,j,count=0;for(i=1;i10;+i)if(i=5) continue;for(j=1;j10;+j)if(i=j) continue;if(j=5) continue;if(i+j6) continue;if(i+j14) continue;if(2*i+j11) continue;if(2*i+j19) continue;if(i+j=10) continue;if(2*i+j=15) continue;if(i+2*j=15) continue;if(3*i+j=20) continue;if(3*i+2*j=25) continue;printf(n第%d解:n,+count);printf(t%d,%d,%dn,i,j,15-i-j);printf(t%d,%d,%dn,20-2*i-j,5,2*i+j-10);printf(t%d,%d,%dn,i+j-5,10-j,10-i);printf(n共找到%d解n,count);void show(int *M,unsigned rows,unsigned cols)printf(n);for(unsigned i=0;irows;+i)for(unsigned j=0;jcols;+j)printf(%d, ,*M+);printf(n);printf(n);/整数型方程/方程数FCS1,未知数WZS1,FCS=WZS/int *M ,每行一个表达式(共FCS行),共WZS+1列(加常数列)int gcd(int a,int b)int c;/处理ba的情况if(ba)c=a,a=b,b=c;doc=a%b,a=b,b=c;while(c);return a;/整数型方程/方程数FCS1,未知数WZS1,FCS=WZS/int *M ,每行一个表达式(共FCS行),共WZS+1列(加常数列)void Equation(int *M,unsigned FCS,unsigned WZS)unsigned row,col,i,j,t;int *P,*Q;/用于访问数组,指向当前操作的方程式int x,y,z,k;+WZS;row=0,col=0,P=M;/参考数row,coldo/寻找非零参考数t=row;Q=P;while(Qcol=0)+t;Q+=WZS;if(t=FCS) break;if(t=FCS)+col;continue;if(P!=Q)/交换for(j=0;jWZS;+j)k=Pj;Pj=Qj;Qj=k;z=Pcol;/参考数位置:row行,col列/消元for(i=row+1,Q=P+WZS;iFCS;+i,Q+=WZS)/第i行y=Qcol;if(y=0) continue;k=gcd(abs(z),abs(y);x=z/k,y/=k;for(j=0;jWZS;+j)/第j列Qj=Qj*x-Pj*y;/show(M,FCS,WZS);/调试输出/getch();+row,+col,P+=WZS;while(rowFCS & colWZS);/show(M,FCS,WZS);/中间结果/寻找非零参考数row=FCS,P=M+row*WZS;do col=0;-row;P-=WZS;while(Pcol=0)+col;if(col=WZS) break;if(col=WZS)continue;/简化for(j=0;jWZS;+j)x=Pj;if(x!=0) break;if(x!=0)x=abs(x);for(;jWZS;+j)y=Pj;if(y=0) continue;x=gcd(x,abs(y);if(x1)for(j=0;jWZS;+j)Pj/=x;/消元z=Pcol;Q=P-WZS;i=row;while(i-)/第i行,i=0,row)y=Qcol;if(y!=0)k=gcd(abs(z),abs(y);x=z/k,y/=k;for(j=0;jWZS;+j)/第j列,j=col,WZS)Qj=Qj*x-Pj*y;Q-=WZS;while(row0 & col0);void huajian()const unsigned fcs=8;const unsigned wzs=9;int Mfcswzs+1=/x12,x13,x21,x22,x31,x32,x33,x11,x231,1,0,0,0,0,0,1,0,-15,0,0,1,1,0,0,0,0,1,-15,0,0,0,0,1,1,1,0,0,-15,0,0,1,0,1,0,0,1,0,-15,1,0,0,1,0,1,0,0,0,-15,0,1,0,0,0,0,1,0,1,-15,0,0,0,1,0,0,1,1,0,-15,0,1,0,1,1,0,0,0,0,-15,;Equation(&M00,fcs,wzs);for(int i=0;ifcs;+i)for(int j=0;j=wzs;+j)printf(%d, ,Mij);printf(n);/*结果1, 0, 0, 0, 0, 0, 0, 2, -1, -10,0, 1, 0, 0, 0, 0, 0, -1, 1, -5,0, 0, 1, 0, 0, 0, 0, 0, 1, -10,0, 0, 0, 1, 0, 0, 0, 0, 0, -5,0, 0, 0, 0, 1, 0, 0, 1, -1, -5,0, 0, 0, 0, 0, -1, 0, 2, -1, 0,0, 0, 0, 0, 0, 0, -1, -1, 0, 10,0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-x12=-2x11+x23+10x13=x11-x23+5x21=-x23+10x22=5x31=-x11+x23+5x32=-2x11+x23x33=-x11+10*/int main(int argc, char* argv)/huajian();test();return 0;/*第1解:2,7,69,5,14,3,8第2解:2,9,47,5,36,1,8第3解:4,3,89,5,12,7,6第4解:4,9,23,5,78,1,6第5解:6,1,87,5,32,9,4第6解:6,7,21,5,98,3,4第7解:8,1,63,5,74,9,2第8解:8,3,41,5,96,7,2*