當前位置:首頁 » 編程語言 » c語言編寫三階幻方
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言編寫三階幻方

發布時間: 2023-01-24 16:09:08

『壹』 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的倍數,演算法還不一樣。

『貳』 怎樣用c語言編寫幻方

你的這個問題實際上包括兩個問題:
1、幻方的演算法
2、怎樣用C語言實現幻方的演算法
這兩個問題是大不同的。

關於幻方的演算法,或者叫幻方填法,目前有很多種,拉丁正交、馬步法等等,針對奇數或者偶數(又分單偶數和雙偶數)等有不同的演算法,但這些演算法只是幫你找到幻方的一個或多個實例(不會是全部),而同階數的幻方到底有多少個,那隻有用窮舉法了,比如4階幻方,基本4階幻方共7040個,剔除旋轉翻轉的,即具有獨立結構的共880個;4階完美幻方共84個,具有獨立結構的共48個。

對於高階幻方(比如超過8階),窮舉法實際上是不可行的,因為它的窮舉時間將是天文數字(以目前主流PC),所以不要試圖用計算機窮舉高階幻方的全部結果,那將是徒勞的。

如果你只是需要1個實例,那麼推薦你使用MATLAB語言工具,因為它提供了幻方函數magic(n),不需要編程,直接從命令窗口輸入就可以得到答案。

至於第二個問題,當然你首先會C語言,剩下的就是編程技巧問題了,而這個問題是無從回答的。相信你問的是第一個問題。
以上的回答雖然沒有明確給出答案,但相信對你會有幫助。

『叄』 如何用c語言編程使三階幻方不等(使用數字1至9,直接輸出所有結果

4用1至9這9個數編制一個三階幻方,寫出所有可能的結果。所謂幻方是指在正方形的方格表的每個方格內填入不同的數,使得每行、每列和兩條對角線上的各數之和...3119

『肆』 C語言崩潰問題

int X[9]={0};
即可。

『伍』 C語言用窮舉法編寫3×3的幻方

這是我用窮舉法寫的
#include "iostream.h"
int a[9];
void PaiLie(int n) //生成1~9的全排列
{
for(int i=0;i<9;i++)
{
for(int i=0;i<9;i++)
if(a[i]<n+1)a[i]=0;
if(!a[i])
{a[i]=n;
if(n>1)
PaiLie(n-1);
else
{
if ( //判定橫豎斜之和為15
a[0]+a[1]+a[2]==15&&a[3]+a[4]+a[5]==15&&a[6]+a[7]+a[8]==15&&
a[0]+a[3]+a[6]==15&&a[1]+a[4]+a[7]==15&&a[2]+a[5]+a[8]==15&&
a[0]+a[4]+a[8]==15&&a[2]+a[4]+a[6]==15
)
{for(int j=0;j<3;j++)
{
for(int i=0;i<3;i++)
cout<<a[j*3+i]<<' ';cout <<endl;
}
cout <<endl;}
}
}
}
}
main()
{
PaiLie(9);
}

過去看這個帖子,最佳答案沒用窮舉
http://..com/question/56156324.html

『陸』 C語言中怎麼編寫n階幻方

/**
* n階幻方絛?br> * 完成者:meteor135
* 完成日期:2003.9.8
* 編譯環境:VC6.0
*/
#include <iostream.h>
#include <iomanip.h>
#include <math.h>

void showFangzhen(int n);

int main()
{
//輸出10組幻方
for(int n = 0; n < 10; n ++)
showFangzhen(2*n+1);

cout<<"Press enter to quit!";
cin.get();

return 0;
}

void showFangzhen(int n)
{
if(!(n%2)) return;

int i,j,**array;

//為指針分配動態內存
array=new int*[n];
for(i=0; i<n; i++)
{
array[i] = new int[n];
}

//初始化數組
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
array[((n-1)/2+i-j+n)%n][(3*n-1+j-2*i)%n]=i*n+j+1;
//or
//array[(n+2*i-j)%n][((n-1)/2+n+j-i)%n]=i*n+j+1;
}
}

//輸出n階幻方
cout<<n<<"階幻方:"<<endl;
for(i=0; i<n; i++)
{
for(j=0;j<n;j++)
{
cout<<setw(int(log10(n*n))+2)<<array[i][j];
}
cout<<endl;
}
cout<<endl;

//釋放動態內存
for(i=0; i<n; i++)
{
delete[] array[i];//原來是 delete array[i];
}
delete[] array;
}
看http://www.programfan.com/club/showtxt.asp?id=17774有更多幫助

『柒』 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語言編程使三階幻方不等

這個列印n階的 0<n<=15是奇數 我在下面幫你改了個3階的
/* bookp33.c 列印魔方陣程序 */
/* 譚浩強,C程序設計題解與上機指導,33頁 */
/* 在tc30下編譯通過 */
/* 2001.12.12 */
void main()
{
int a[16][16],i,j,k,p,m,n;
p=1;
while(p==1)
{ printf("請輸入n.(0<n<=15,n是奇數.)\n");
scanf("%d",&n);
if((n>=0)&&(n<=15)&&(n%2!=0))
{ printf("矩陣階數是:%d\n",n);
p=0;
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
/* 建立魔方陣 */
j=n/2+1;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{ i=i-1;
j=j+1;
if((i<1)&&(j>n))
{ i=i+2;
j=j-1;
}
else
{if(i<1) i=n; if(j>n) j=1; }
if(a[i][j]==0)
a[i][j]=k;
else
{ i=i+2;
j=j-1;
a[i][j]=k;
}
}
/* 輸出 */
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
printf(" %3d",a[i][j]);
printf("\n");
}
}

*************3階的************
int main()
{
int a[16][16],i,j,k,n;
n=3;

for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
/* 建立魔方陣 */
j=n/2+1;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{ i=i-1;
j=j+1;
if((i<1)&&(j>n))
{ i=i+2;
j=j-1;
}
else
{if(i<1) i=n; if(j>n) j=1; }
if(a[i][j]==0)
a[i][j]=k;
else
{ i=i+2;
j=j-1;
a[i][j]=k;
}
}
/* 輸出 */
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
printf(" %3d",a[i][j]);
printf("\n");
}

return (1);
}

『玖』 如何用C語言編寫幻方多謝回答

//分析:魔方陣有如下規律:
// 1:自然數1總是在方陣第一行當中一列上。
// 2:後續的自然數在當前數的右上方,
// 1)如果是在第一行則行數變為第n行列數加1 ;
// 2)如果是在最後一列,行數減1,列數為第1行。
// 3)如果後續的數所處位置已有數,則行數加1,列數不變。
/******************************************************************************************************************************
巧填奇數階幻方(魔方陣)[轉]2007-01-03 17:57 一、什麼叫幻方?
(通俗點說)把一些有規律的數填在縱橫格數都相等的正方形圖內,使每一行、每一列和每一條對角線上各個數之和都相等。這樣的方陣圖叫做幻方。
幻方又分為奇數階幻方和偶數階幻方。奇數階幻方是指橫行、豎列都是單數(即3、5、7、9……)的方陣圖。偶數階幻方是指橫行、豎列都是雙數(即4、6、8、10……)的方陣圖。
二、奇數階幻方的填法。
奇數階幻方中最簡便的一種就是三階幻方,又稱「九宮圖」。
平常我們遇到這類題都是用分析、分組、嘗試的方法推出,這種方法較麻煩,如果是五階幻方、七階幻方就更困難了。
有一種方法不僅能很快地填出三階幻方,還能很快地填出五階幻方、七階幻方、九階幻方……那就是「口訣法」
口 訣
「1」坐邊中間,斜著把數填;
出邊填對面,遇數往下旋;
出角僅一次,轉回下格間。
注意:
(1)這里的「1」,是指要填的這一列數中的第一個數。
(2)「1」坐邊中間,指第一個數要填在任何一邊的正中間的空格里。
(3)從1到2時,必須先向邊外斜(比如:第一個數填在上邊的正中間,填第二個數時,要向左上方或右上方斜),填後面的數時也要按照同樣的方向斜。
*******************************************************************************************************************************/
#include<iostream>
using namespace std;
void main()
{
int a[32][32],i,j,k,p,n;
p=1;
while(p==1)
{
cout<<"Enter n(n=1~25):";
cin>>n;
if((n!=0)&&(n<=25)&&(n%2!=0))
p=0;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
j=n/2+1;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<1)&&(j>n))
{
i=i+2;
j=j-1;
}
else
{
if(i<1)
i=n;
if(j>n)
j=1;
}
if(a[i][j]==0)
a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}

}

/*C_ban*
所謂的魔方距陣就是一種特殊的奇數階方陣:它的行,列,對角線,上的數字之和都要相等,且方陣中的每一個數字都不相等,且數字的范圍都在1到n*n之間.
我編的程序如下:
*/
#include<stdio.h>
#define N 15
main()
{
int i,j,row,cloum,size,square[N][N],count;
clrscr();
printf("please enter the square size(odd && <=15):\n");
scanf("%d",&size);
while(size%2==0||size>15||size<3)
{
printf("error e to the wrng input!please input it again!\n");
scanf("%d",&size);
}
for(i=0;i<size;i++)
for(j=0;j<size;j++)
square[i][j]=0;
i=0;j=(size-1)/2;
square[i][j]=1;
for(count=2;count<=size*size;count++)
{
row=i-1<0?(size-1):(i-1);
cloum=j-1<0?(size-1):(j-1);
if(square[row][cloum])
i=(++i)%size;
else
{i=row;
j=j-1<0?(size-1):(j-1);
}
square[i][j]=count;
}
printf("the %d square is:\n",size);
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
printf("%d",square[i][j]);
printf("\n");
}
}

只能求奇數的魔方陣
#define N 20
main()
{
int a[N][N];
int n,i,j,r;
scanf("%d",&n);
for(i=0;i<N;i++) for(j=0;j<N;j++) a[i][j]=0;
i=0;
j=n/2;
a[i][j]=1;
for (r=2;r<=n*n;r++)
if (a[(i+n-1)%n][(j+1)%n]==0)
{i=(i+n-1)%n;j=(j+1)%n;a[i][j]=r;}
else
{i=(i+1)%n;a[i][j]=r;}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) printf("%4d",a[i][j]);
printf("\n");
}
}
這是以前別人寫的,你參考一下!

『拾』 用c語言編寫一個求三次方的函數,並調用該函數求變數x, y的三次方之和及差

#include<stdio.h>

longcube(intx)
{
returnx*x*x;
}

intmain()
{
intx,y;
scanf("%d%d",&x,&y);
printf("%d^3+%d^3=%ld",x,y,cube(x)+cube(y));
printf("%d^3-%d^3=%ld",x,y,cube(x)-cube(y));
return0;
}