奇阶幻方

功能:1)输出任意阶数的奇阶幻方;2)检验输入的方阵是否为奇阶幻方

#include <stdio.h>
#include <stdlib.h>
int create(int a[][100],int n);//生成幻方
int input(int a[][100],int *n);//输入方阵
int check(int a[][100],int n);//检验是否为幻方

int main(void)
{
    int a[100][100],n = 0,i,j,t;
    
    while (1)
    {
//        功能选择
        printf("Which function you want to choose, create1, check2, break0?\n");
        scanf("%d",&t);
        
        for (i=0; i<100; i++)
        {
            for (j=0; j<100; j++)
            {
                a[i][j] = 0;
            }
        }
        
//        输入0,退出
        if (t == 0)
        {
            break;
        }
//        输入1,生成幻方
        else if (t == 1)
        {
            while (1)
            {
                printf("Input an odd number n.\n");
                scanf("%d",&n);
                
                if (n%2==1 && n>0)
                {
                    break;
                }
                else
                {
                    printf("n must be an odd number.\n");
                    continue;
                }
            }
        
            create(a,n);
            
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                {
                    printf("%-4d",a[i][j]);
                    
                }
                printf("\n");
            }
        }
        
//        输入2,检验输入的是否为幻方
        else if (t == 2)
        {
            input(a,&n);
            
            if (n%2 == 0)
            {
                printf("Not odd.\n");
                continue;
            }
            
            if (check(a, n)==1)
            {
                printf("Success!\n");
                
            }
            else
                printf("Fail!\n");
        }
        
    }
    return 0;
}

int create(int a[][100],int n)
{
    int x,i,j,t;
    x = 1;
    i = 0;
    j = (n+1)/2-1;
    
    for (t = 0; t < (n*n); t++)
    {
//        已有数
        if (i>=0 && j<=(n-1) && *(*(a+i)+j)!=0)
        {
            i += 2;
            j--;
            *(*(a+i)+j) = x;
        }
//        正常填数
        if (i>=0 && j<=(n-1) && *(*(a+i)+j)==0)
        {
            *(*(a+i)+j) = x;
        }
//        行超出
        if (i<0 && j<=(n-1))
        {
            i = n-1;
            *(*(a+i)+j) = x;
        }
//        列超出
        if (i>=0 && j>(n-1))
        {
            j = 0;
            *(*(a+i)+j) = x;
        }
//        行列同时超出
        if (i<0 && j>(n-1))
        {
            i = 1;
            j = n-1;
            *(*(a+i)+j) = x;
        }
        i--;
        j++;
        x++;
    }
    
    return 0;
}


int input(int a[][100], int *n)
{
    int N=0, i, j, num=0;//N为行列号,num为位(包括数、符号和小数点)
    char s[100], digit[10]={};
    
    printf("Input the Matrix.\n");
//    通过输入第一行(当作字符串)来判断行列数n
    getchar();
    gets(s);
//    判断每个字符,到回车跳出
    for (i=0; s[i] != '\0'; i++)
    {
//        如果此字符是数字
        if ((s[i]>='0' && s[i]<='9') || s[i]=='-')
        {
            digit[num] = s[i];
            num++;//这个数的位加一
//            防止不运行最后一个数
            if (s[i+1] == '\0')
            {
                s[i+1] = ' ';
                s[i+2] = '\0';
            }
        }
//        空格处算出这个数
        else if (s[i] == ' ')
        {
            a[0][N] = atof(digit);
            N++;
//            初始化位数num和digit[]
            for (j=0; j<num; j++)
            {
                digit[j] = '\0';
            }
            num = 0;
        }
    }
    
//    后 n-1 行直接输入
    for (i=1; i<N; i++)
    {
        for (j=0; j<N; j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    *n = N;
    
    return 0;
}

int check(int a[][100],int n)
{
    int x,y,t,i,j;
//    x为每行列以及对角线的和的理想值,y为每行列以及对角线的和的实际值
    x = (n*n*n+n)/2;
    y = 0;
    t = 0;
    
//    判断每行和是否正确
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            y += *(*(a+i)+j);
        }
        if (y == x)
        {
            t++;
        }
        y = 0;
    }
    
//    判断每列和是否正确
    for (j = 0; j < n; j++)
    {
        for (i = 0; i < n; i++)
        {
            y += *(*(a+i)+j);
        }
        if (y == x)
        {
            t++;
        }
        y = 0;
    }
    
//    判断主对角线和是否正确
    for (i = 0; i <n; i++)
    {
        y += *(*(a+i)+i);
    }
    if (y == x)
    {
        t++;
    }
    y = 0;
    
//    判断副对角线是否正确
    for (i = 0; i < n; i++)
    {
        y += *(*(a+i)+(n-i-1));
    }
    if (y == x)
    {
        t++;
    }
    y = 0;
    
    if (t == (2*n+2))
    {
        t = 1;
    }
    else
        t =0;
    
    return t;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值