日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言实现魔方阵代码及解析

發布時間:2023/12/2 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现魔方阵代码及解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述

編寫程序,實現如下表所示的5-魔方陣。

17241815
23571416
46132022
101219213
11182529

5-魔方陣

問題分析

所謂“n-魔方陣”,指的是使用1?n2共n2個自然數排列成一個n×n的方陣,其中n為奇數;該方陣的每行、每列及對角線元素之和都相等,并為一個只與n有關的常數,該常數為n×(n2 1)/2。

例如4-魔方陣,其第一行、第一列及主對角線上各元素之和如下:

  • 第一行元素之和:17 24 1 8 15=65

  • 第一列元素之和:17 23 4 10 11=65

  • 主對角線上元素之和:17 5 13 21 9=65

而 n×(n2 1)/2=5×(52 1)/2=65 可以驗證,5-魔方陣中其余各行、各列及副對角線上的元素之和也都為65。
假定陣列的行列下標都從0開始,則魔方陣的生成方法為:在第0行中間置1,對從2開始的其余n2-1個數依次按下列規則存放:
(1) 假定當前數的下標為(i,j),則下一個數的放置位置為當前位置的右上方,即下標為(i-1,j 1)的位置。
(2) 如果當前數在第0行,即i-1小于0,則將下一個數放在最后一行的下一列上,即下標為(n-1,j 1)的位置。
(3) 如果當前數在最后一列上,即j 1大于n-1,則將下一個數放在上一行的第一列上,即下標為(i-1,0)的位置。
(4) 如果當前數是n的倍數,則將下一個數直接放在當前位置的正下方,即下標為(i 1,j)的位置。

算法設計

在設計算法時釆用了下面一些方法:

  • 定義array()函數,array()函數的根據輸入的n值,生成并顯示一個魔方陣,當發現n不是奇數時,就加1使之成為奇數。

  • 使用動態內存分配與釋放函數malloc()與free(),在程序執行過程中動態分配與釋放內存,這樣做的好處是使代碼具有通用性,同時提高內存的使用率。

在分配內存時還要注意,由于一個整型數要占用兩個內存,因此,如果魔方陣中要存放的數有max個,則分配內存時要分配2*max個單元,從而有malloc(max max)。在malloc()函數中使用max max而不是2*max是考慮了程序運行的性能。顯然應該使用二維數組來表示魔方陣,但雖然數組是二維形式的,而由于內存是一維線性的,因此在存取數組元素時,要將雙下標轉換為單個索引編號。在程序中直接定義了指針變量來指向數組空間,即使用malloc()函數分配的內存。

下面是完整的代碼:

#include
#include

int array(int n)
{
? ? int i, j, no, num, max;
? ? int *mtrx;
? ? if(n%2 == 0)? /*n是偶數,則加1使其變為奇數*/
? ? {
? ? ? ? n=n 1;
? ? }
? ? max=n*n;
? ? mtrx=(int *)malloc(max max);? /*為魔方陣分配內存*/
? ? mtrx[n/2]=1;? /* 將1存入數組*/
? ? i=0;? /*自然數1所在行*/
? ? j=n/2;? /*自然數1所在列*/
? ? /*從2開始確定每個數的存放位置*/
? ? for(num=2; num<=max; num )
? ? {
? ? ? ? i=i-1;
? ? ? ? j=j 1;
? ? ? ? if((num-1)%n == 0)? /*當前數是n的倍數*/
? ? ? ? {
? ? ? ? ? ? i=i 2;
? ? ? ? ? ? j=j-1;
? ? ? ? }
? ? ? ? if(i<0)? /*當前數在第0行*/
? ? ? ? {
? ? ? ? ? ? i=n-1;
? ? ? ? }
? ? ? ? if(j>n-1)? /*當前數在最后一列,即n-1列*/
? ? ? ? {
? ? ? ? ? ? j=0;
? ? ? ? }
? ? ? ? no=i*n j;? /*找到當前數在數組中的存放位置*/
? ? ? ? mtrx[no]=num;
? ? }
? ? /*打印生成的魔方陣*/
? ? printf("生成的%d-魔方陣為:",n);
? ? no=0;
? ? for(i=0; i? ? {
? ? ? ? printf("\n");
? ? ? ? for(j=0; j? ? ? ? {
? ? ? ? ? ? printf("=", mtrx[no]);
? ? ? ? ? ? no ;
? ? ? ? }
? ? }
? ? printf("\n");
? ? free(mtrx);
? ? return 0;
}

int main()
{
? ? int n;
? ? printf("請輸入n值:\n");
? ? scanf("%d", &n);
? ? array(n);? /*調用array函數*/
? ? return 0;
}

運行結果:

linuxidc@linuxidc:~$ ./linuxidc
請輸入n值:
5
生成的5-魔方陣為:
?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

知識點補充

在解決該問題時,采用的是動態分配內存的方式,并使用了指針變量mtrx來指向二維數組中的元素。在算法設計中,要存儲魔方陣需要一個二維數組,因此再給出直接使用二維數組來生成8-魔方陣的程序。

直接使用二維數組生成5-魔方陣的代碼如下:

#include
#define N 8
int main()
{
? ? int a[N][N]={0}, i, j, k, t, x, y;
? ? i=0;? /*自然數1的行標*/
? ? j=N/2;? /*自然數1的列標*/
? ? t=N-1;? /*最后一行、最后一列的下標*/
? ? for(k=1; k<=N*N; k )
? ? {
? ? ? ? a[i][j]=k;
? ? ? ? x=i;
? ? ? ? y=j;
? ? ? ? if(i == 0)
? ? ? ? ? ? i=t;
? ? ? ? else
? ? ? ? ? ? i=i-1;
? ? ? ? if(j != t)
? ? ? ? ? ? j=j 1;
? ? ? ? else
? ? ? ? ? ? j=0;
? ? ? ? if(a[i][j]!=0)
? ? ? ? {
? ? ? ? ? ? i=x 1;
? ? ? ? ? ? j=y;
? ? ? ? }
? ? }
? ? printf("linuxidc.com生成的8-魔方陣為:");
? ? for(i=0; i? ? {
? ? ? ? printf("\n");
? ? ? ? for(j=0; j? ? ? ? {
? ? ? ? ? ? printf("=", a[i][j]);
? ? ? ? }
? ? }
? ? printf("\n");
? ? return 0;
}

示例輸出如下:

linuxidc.com生成的8-魔方陣為:
?41 43 53 63? 1 11 21 31
?42 52 62? 8 10 20 30 40
?51 61? 7? 9 19 29 39 49
?60? 6 16 18 28 38 48 50
? 5 15 17 27 37 47 57 59
?14 24 26 36 46 56 58? 4
?23 25 35 45 55? 0? 3 13
?32 34 44 54 64? 2 12 22

來源:https://www.linuxidc.com/Linux/2018-10/155082.htm

總結

以上是生活随笔為你收集整理的C语言实现魔方阵代码及解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。