N阶奇数幻方
/*3阶矩阵
3*3矩阵,横竖对角都等于一个恒值 (15)
分析:
建立一个3*3二维数组a[3][3],将num=1赋值给a[0][1],然后保存其下标,a[0][1]的右上角的值等于num++,依次循环,
对于下标,肯定会越界,这里使用
int ki = (i-1+3)%3;
int kj = (j+1)%3;
便可解决
如果 右上角的位置有元素的话,则将num++赋值给其正下方的位置
*/
#include<iostream>
using namespace std;
int main()
{
int i,j;
int kn;
while (1)
{
cout<<"输入奇数幻方阶数:";
cin>>kn;
while (1) //判断输入的是否是奇数
{
if (kn%2==0 || kn<2)
{
cout<<"输入数据错误!请重新输入奇数:";
cin>>kn;
}
else
{
break;
}
}
int **a = new int*[kn]; //动态分配二维数组
for ( i=0; i<kn; i++)
{
a[i] = new int[kn];
for ( j=0; j<kn; j++)
{
a[i][j] = 0; //数组初始化为0
}
}
//固定第一行中间列的位置为1
int num = 1;
i = 0;
j = kn/2;
a[0][j] = num;
while (num<kn*kn)
{
num++;
int ki = (i-1+kn)%kn; //保存右上角x,y坐标
int kj = (j+1)%kn;
if (a[ki][kj] == 0) //如果右上角元素为空(还没有数据填充)
{
a[ki][kj] = num;
i = ki;
j = kj;
}
else //如果右上角位置有元素 ,则放于其正下方
{
i = (ki+2)%kn;
j = (kj-1+kn)%kn; //相减 的需加上kn个周期
a[i][j] = num;
}
}
//输出数组元素
for (int m=0; m<kn; m++)
{
for (int n=0; n<kn; n++)
{
cout<<a
[n]<<" ";
}
cout<<endl;
}
//输出每行没列的结果
int sum = 0;
for (int g=0; g<kn; g++)
{
sum = sum+a[0][g];
}
cout<<"每行每列及对角线之和为:"<<sum<<endl;
}
system("pause");
return 0;
}