Ⅰ c語言實現 3階幻方
#include<stdio.h>
int main()
{
int i,j,i1,j1,x,a[100][100];
for(i=1;i<=3;i++)
{
for(j=1;j<=3;j++)
a[i][j] = 0;
}
i=1;
j = (int)((3+1)/2);
x=1;
while(x<=3*3)
{
a[i][j] = x;
x++;
i1=i;
j1=j;
i--;
j--;
if(i==0)
i=3;
if(j==0)
j=3;
if(a[i][j] != 0)
{
i = i1+1;
j = j1;
}
}
for(i=1;i<=3;i++)
{
for(j=1;j<=3;j++)
printf("%3d",a[i][j]);
printf("\n");
}
return 1;
}
Ⅱ c語言 如何求三階魔方陣,最好帶注釋
#include <stdio.h>
#include <math.h>
#define N 100 /*N可以改變*/
void main()
{
int n,p=1;
void jici(int n);
void sioubeishu(int n);
void oubeishu(int n);
void sijibeishu(int n);
void elseoushu(int n);
printf("***說明(本程序用於輸出任意數階次的魔方矩陣,其行,列,對角線之和的均值相同。) ");
printf(" ***說明(最右邊的,和最下邊的用於統計每行,每列的元素之和 。) ");
printf(" 請輸入一個要求階次的魔方矩陣的邊長(2~%d): ",N);
while(p)
{
scanf("%d",&n);
if((n>1)&&(n<=N))
p=0;
}
if(fabs((n-1)%2)<1e-006)
jici(n);
else
if(fabs((n%4))<1e-006)
{
if(n==4) oubeishu(n);
else
if(fabs(n%8)<1e-006)
sioubeishu(n);
else
sijibeishu(n);
}
else
elseoushu(n);
}
void jici(int n)
{
int a[N][N]={0};
int i,j,k,sum;
i=0;
j=(n-1)/2;
a[0][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<0)&&(j>n-1))
{
i=i+2;j=j-1;
}
else
{
if(i<0) i=n-1;
if(j>n-1) j=0;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf(" ");
}
}
void oubeishu(int n)
{
int a[N][N]={0};
int k,t,i,j,sum;
k=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
a[i][j]=k;
k++;
}
for(i=0,j=0;i<n/2;i++,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
for(i=0,j=n-1;i<n/2;i++,j--)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf(" ");
}
}
void sioubeishu(int n)
{
int a[N][N]={0};
int k,t,i,j,x,y,sum;
k=1;
for(j=0;j<n;j++)
for(i=0;i<n;i++)
{
a[i][j]=k;
k++;
}
for(x=1;x<=n/8;x++)
for(y=1;y<=n/4;y++)
{
for(i=4*(x-1),j=4*(y-1);i<=4*x-1;i++,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
for(i=4*x-1,j=4*(y-1);i>=4*(x-1);i--,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf(" ");
}
}
void sijibeishu(int n)
{
int a[N][N]={0};
int k,t,i,j,x,y,sum;
k=1;
for(j=0;j<n;j++)
for(i=0;i<n;i++)
{
a[i][j]=k;
k++;
}
for(x=1;x<=(n-4)/8;x++)
for(y=1;y<=n/4;y++)
{
for(i=4*(x-1),j=4*(y-1);i<=4*x-1;i++,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
for(i=4*x-1,j=4*(y-1);i>=4*(x-1);i--,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
}
x=(n+4)/8;
for(y=1;y<(n+4)/8;y++)
{
for(i=4*(x-1),j=4*(y-1);i<=4*x-1;i++,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
for(i=4*x-1,j=4*(y-1);i>=4*(x-1);i--,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
}
y=(n+4)/8;
for(i=4*(x-1),j=4*(y-1);i<=4*x-3;i++,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
for(i=4*x-1,j=4*(y-1);i>=4*x-2;i--,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf(" ");
}
}
void elseoushu(int n)
{
int a[N][N]={0};
int m,k,i,j,sum,u,t,h;
m=n/2;
i=0;
j=(m-1)/2;
a[0][j]=1;
for(k=2;k<=m*m;k++)
{
i=i-1;
j=j+1;
if((i<0)&&(j>m-1))
{
i=i+2;j=j-1;
}
else
{
if(i<0) i=m-1;
if(j>m-1) j=0;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
i=0;
j=(m-1)/2+m;
a[i][j]=m*m*2+1;
for(k=m*m*2+2;k<=m*3*m;k++)
{
i=i-1;
j=j+1;
if((i<0)&&(j>m*2-1))
{
i=i+2;
j=j-1;
}
else
{
if(i<0) i=m-1;
if(j>m*2-1) j=m;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
i=m;
j=(m-1)/2;
a[i][j]=m*m*3+1;
for(k=m*m*3+2;k<=m*4*m;k++)
{
i=i-1;
j=j+1;
if((i<m)&&(j>m-1))
{
i=i+2;j=j-1;
}
else
{
if(i<m) i=m*2-1;
if(j>m-1) j=0;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
i=m;
j=(m-1)/2+m;
a[i][j]=m*m+1;
for(k=m*m+2;k<=2*m*m;k++)
{
i=i-1;
j=j+1;
if((i<m)&&(j>m-1+m))
{
i=i+2;
j=j-1;
}
else
{
if(i<m) i=m*2-1;
if(j>m*2-1) j=m;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
t=(n+2)/4;u=n/2;
for(j=0;j<t-1;j++)
for(i=0;i<m;i++)
{
h=a[i][j];
a[i][j]=a[i+m][j];
a[i+m][j]=h;
}
for(j=n-t+2;j<n;j++)
for(i=0;i<m;i++)
{
h=a[i][j];
a[i][j]=a[i+m][j];
a[i+m][j]=h;
}
{
h=a[t-1][0];
a[t-1][0]=a[t+u-1][0];
a[t+u-1][0]=h;
}
{
h=a[t-1][t-1];
a[t-1][t-1]=a[t+u-1][t-1];
a[t+u-1][t-1]=h;
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf(" ");
}
}
這個是我自己編的魔方矩陣的任意數輸出程序, 用的是數組方面的內容,比較好理解
Ⅲ C或C++編寫三階幻方
它分奇偶數的。
奇數的規律比較明確,偶數也有規律。
三階
8 1 6
3 5 7
4 9 2
五階
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
對於三階
數1都在第一行的正中央(1行2列),然後你往它的上一行,下一列(0行3列,由於沒有0行,就往最底下去。變成3行3列),接著就是2行1列
然後再1行2列,由於已經被1給佔了,那麼第4個數就放在1的正下方,反復如此就可以得到奇數階的幻方數。
4階
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
6階
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
8階
64 2 3 61 60 6 7 57
9 55 54 12 13 51 50 16
17 47 46 20 21 43 42 24
40 26 27 37 36 30 31 33
32 34 35 29 28 38 39 25
41 23 22 44 45 19 18 48
49 15 14 52 53 11 10 56
8 58 59 5 4 62 63 1
偶數價我給忘了。但是我記得好像是4的倍數跟不是4的倍數,演算法還不一樣。
Ⅳ 3階幻方怎麼寫
填寫3階幻方的口訣:
居上行正中央,依次斜填切莫忘,上出框界往下寫,右出框時左邊放,重復便在下格填,出角重復一個樣。
口訣解釋如下:
居上行正中央——數字 1 放在首行最中間的格子中;
依次斜填切莫忘——向右上角斜行,依次填入數字;
上出框界往下寫——如果右上方向出了上邊界,就以出框後的虛擬方格位置為基準,將數字豎直降落至底行對應的格子中;
右出框時左邊放——同上,向右出了邊界,就以出框後的虛擬方格位置為基準,將數字平移至最左列對應的格子中;
重復便在下格填——如果數字{N} 右上的格子已被其它數字佔領,就將{N+1} 填寫在{N}下面的格子中;
出角重復一個樣——如果朝右上角出界,和「重復」的情況做同樣處理。
「蘿卜」法 一 居 上 行 正 中 央 依 次 填 在 右 上 角 8 1 6 上 出 框 時 下 邊 填 3 5 7 右 出 框 時 左 邊 放 4 9 2 斜 出 框 時 下 邊 放 排 重 便 在 下 格 填 九階幻方也同樣適用哦!
(4)用程序寫3階幻方擴展閱讀:
一、三階幻方是最簡單的幻方,是由9個數字組成的一個三行三列的矩陣,其每一行、每一列和兩條對角線的數字的和(稱為幻和值)都相等。
如用1、3、5、9、11、13、17、19、21這9個數字組成的三階幻方:
19 1 13
5 11 17
9 21 3
幻和值=33。
最簡單的三階幻方是用1、2、3、4、5、6、7、8、9這9個數組成的:
6 1 8
7 5 3
2 9 4
幻和值=15。
二、3階幻方的性質:
下面是用1-9構成的3階幻方:
8 1 6
3 5 7
4 9 2
幻和值=15。
性質一:幻和值=3×5(3×中心格數);
性質二:2×8=9+7,2×4=1+7,2×6=3+9,2×2=1+3;即:2×角格的數=非相鄰的2個邊格數之和。
性質三:以中心對稱的2個數相加的和相等,這2個數的和值=2×中心格數。
性質四:幻方的每個數乘以X,再加Y,幻方亦成立。
例如把1-9構成的3階幻方的每個數乘以3,再加3:
27 6 21
12 18 24
15 30 9
幻和值=54
性質五:3個一組的數,組與組等差,每組數與數等差,這樣的數能構成3階幻方。
例如以下3組9個數:
【2、4、6】、【13、15、17】、【24、26、28】構成幻方,
26 2 17
6 15 24
13 28 4
幻和值=45。
三、2個推論:
(由性質三)推論:以中心對稱的2個數同為偶數或同為奇數;
(由性質二、三)推論:4個邊格數同為偶數或同為奇數。
Ⅳ 求高手用c++程序編寫一個三階幻方,要用c++哦
#include "iostream.h" int main() { int magic[3][3],i=0,j=1,num; const int m=3; for (i=0;i<3;i++) for(j=0;j<3;j++) magic[i][j]=0; magic[0][1]=1; i=0;j=1; for (num=2;num<=9;num++) { if (magic[(i-1+m)%m][(j+1)%m]) i++; else { i=(i+2)%m; j=(j+1)%m; } magic[i][j]=num; } for(i=0;i<3;i++) { for (j=0;j<3;j++) { cout<<magic[i][j]<<'\t'; } cout<<endl; } return 0; }
麻煩採納,謝謝!
Ⅵ 做一個三階幻方,使每行,每列,每條對角線上的三個數之和都等於60
一、3階幻方的幻和值N=3×中心格數.
(證明方法:兩條對角線和中間行的3組數之和=3N,變式為:1、3列之和+3×中心格數=3N,即,2N+3×中心格數=3N,得:N=3×中心格數.)
3×中心格數=60,得:中心格數=20
二、那麼,什麼樣的數能構成3階幻方呢?
3個數一組的3組數(共9個數),組與組等差,每組數與數等差,這樣的數能構成3階幻方.
【文字啰嗦,直接看圖】
等等.
其中的數也可是負數,就不一一列舉了.