2017.11.3 关于C语言程序设计现代方法第9章第5题&&第8章第17题

来源:互联网 发布:java date 格式化毫秒 编辑:程序博客网 时间:2024/06/13 19:03

幻方问题。

我的代码如下,如有错误,恳请指正:

  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100
#include <stdio.h>#define N 99void create_magic_square(int n,int magic_square[N][N]);void print_magic_square(int n,int magic_suqre[N][N]);int main(void){    int n;conti:    printf("This program creates a magic square of a specified size.\n");    printf("The size must be an odd number between 1 and 99.\n");    printf("Enter size of magic square: \n");    scanf("%d",&n);//获取幻方的大小。    printf("\n");    if ( n % 2 == 0 || n > 99)    {        printf("Illegal input!\n\n");        goto conti;//按照题目要求输入99以内的奇数,如果不满足条件,则继续输入。    }    int magic_square[N][N];//假设幻方大小为99*99。    create_magic_square(n,magic_square);    print_magic_square(n,magic_square);//输出幻方。    return 0;}void create_magic_square(int n,int magic_square[N][N]){    int x,y,mid,max,i,flag[N][N] = {0};//flag数组用来标识被占用的数组。//全部初始化为0,每占用一个,把1赋给相应的flag。    int sx,sy;//sx和sy用来存储每次循环前x和y的位置。//如果遇到要走的位子被占的情况下,可以直接//在原来的sx和sy的基础上移动。向下移动即y+1。//(因为在下面的运算过程中,会改变x和y的值)//sx和sy是为了下一步位子被占的情况准备的。    mid = n / 2;//奇数除以二得中间的位子。    max = n * n;//幻方中数字的最大值。    x = mid; y = 0;//初始化x,y。    magic_square[x][y] = 1;//使第0行中间一个数字为1。    flag[x][y] = 1;//标识第0行中间一个数字已经被占用。    for (i = 2;i <= max;i++)//从2开始循环,一直到max循环结束。    {        sx = x;        sy = y;        if ( (x + 1) > (n - 1))        {           x = 0;        }//如果越界,则绕回。        else        {           x = x + 1;        }//如果没有越界,则继续。        if ( (y - 1) < 0)        {            y = n - 1;        }        else        {            y = y - 1;        }        if (flag[x][y] == 0)        {            magic_square[x][y] = i;            flag[x][y] = 1;        }//对于没有被占用位子的情况进行操作。        else        {            x = sx;            y = sy;            y = y + 1;            magic_square[x][y] = i;            flag[x][y] = 1;        }//对于下一步位子被占用的情况进行操作。    }}void print_magic_square(int n,int magic_square[N][N]){    int x,y;    for (y = 0;y < n;y++)    {        for (x = 0;x < n;x++)        {            printf("%3d",magic_square[x][y]);        }        printf("\n");//每n行,一个换行符。    }//输出幻方。}

阅读全文
0 0
原创粉丝点击