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

幻方问题。

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

  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
 99
100
#include <stdio.h>

#define N 99

void 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行,一个换行符。
    }//输出幻方。
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值