Mgwhisper 2022-06-07 19:49 采纳率: 100%
浏览 115
已结题

C语言,看看,素数魔方阵

C语言,有点急。
构造魔方阵:
1.根据用户输入的矩阵的阶数n (n为奇数),编写程序构造nn 阶魔方阵,图35.1
是一个3
3魔方阵实例。
2.根据用户输入的素数范围m构造所有的3*3阶素数魔方阵,即找出9个不大于m的
素数并排构成魔方阵。
[功能要求]
1.主函数实现主菜单的显示,如图35.2所示。
魔方阵
1.奇数阶魔方阵
2.素数魔方阵
请输入选项:
图35. 2程序主菜单
2.编写一个函数根据用户输入的阶数构造奇数阶魔方阵,并输出各行、列及主、副对角
线相等的和值。当用户输入偶数时,要求再次输入,直到用户输入为奇数为止,如图35. 3
所示。.

4.编写一个函数根据用户输入的素数范围m构造所有的素数魔方阵,素数魔方阵中的各个组成元素值均为1--m之间的素数。图35. 4给出了3个由小于80的素数组成的素数魔方阵。.

img

img

  • 写回答

3条回答 默认 最新

  • ...404 Not Found 2022-06-07 20:43
    关注
    
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    void menu()
    {
        printf("  魔方阵\n");
        printf("****************************\n");
        printf("1.奇数阶魔方阵\n");
        printf("2.素数魔方阵\n");
        printf("0.退出\n");
        printf("****************************\n");
    }
    
    void odd()
    {
        int n=0;
        while (n % 2 == 0)
        {
            printf("请输入奇数阶数:");
            printf("\n");
            scanf("%d", &n);
        }
        int **a = (int**)calloc(n, sizeof(int*));
        for (int i = 0; i < n; i++)
            a[i] = (int*)calloc(n, sizeof(int));
        a[0][n / 2] = 1;//1放在第一行中间
        int row= 0;//当前行下标
        int col = n/ 2;//当前列下标
        for (int i = 2; i <= n*n; i++) //一个一个数字去填 遍历下标 不是按行列了
        {
            //上一行后一列
            row = (row - 1 + n) % n;   //环形处理
            col = (col + 1) % n;
            //当前位置有数字有数字
            if (a[row][col] != 0)
            {
                row = (row + 2) % n;
                col = (col - 1 + n) % n;
            }
            a[row][col] = i;
        }
        int sum = 0;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (i == j)
                    sum += a[i][j];
                printf("%d\t", a[i][j]);
            }
            printf("\n\n\n");
        }
        printf("各行、列及主、副对角线相等的和为:\t%d\n", sum);
    }
    int sushu(int n)
    {
        int i;
        if (n == 1) return 1;
        for (i = 2; i <= n; i++)
            if (n%i == 0) break;
        if (n == i) return 1;
        else return 0;
    }
    int wunai(int t, int b, int c, int d, int e, int f, int g, int h, int p)
    {
        int a[9];
        int i, j;
        a[0] = t; a[1] = b; a[2] = c; a[3] = d; a[4] = e; a[5] = f; a[6] = g; a[7] = h; a[8] = p;
        for (i = 0; i < 9; i++)
            for (j = i + 1; j < 9; j++)
                if (a[i] == a[j]) return 0;
        for (i = 0; i < 9; i++)
            if (sushu(a[i]) != 1) return 0;
        return 1;
    }
    bool isPrime(int n)
    {
        if (n == 2)
            return true;
        if (n % 2 == 0)
            return false;
        for (int i = 3; i <= sqrt(n); i += 2)//跳过偶数
        {
            if (n%i == 0)
                return false;
        }
        return true;
    }
    void prime()
    {
        int k;
        printf("请输入组成魔方阵的素数范围(小于100):");
        printf("\n");
        scanf("%d", &k);
        int i, i1, i2;
        static int j = 0, n = 0;
        int a, b, c, d, z;
        int ar[500];
        for (i = 1; i < k; i++)
            if (sushu(i) == 1) { ar[j] = i; j++; }
        for (i = 0; i < j; i++)
        {
            a = ar[i];
            for (i1 = 0; i1 < j; i1++)
            {
                b = ar[i1];
                for (i2 = 0; i2 < j; i2++)
                {
                    d = ar[i2];
                    c = (a + 2 * b + d) / 4;
                    if ((a != b && b != d) && ((a + 2 * b + d) % 4 == 0) && sushu(c) == 1)
                    {
                        z = 3 * c;
                        if (wunai(a, b, c, d, z - a - b, z - c - d, z - b - c, z - a - c, z - b - d))
                            if ((z - a - b) > 0 && (z - c - d) > 0 && (z - b - c) > 0 && (z - a - c) > 0 && (z - b - d) > 0)
                            {
                                if ((z - a - b) < k && (z - c - d) < k && (z - b - c) < k && (z - a - c) < k && (z - b - d) < k)
                                {
                                    printf("%d ", z - a - b);
                                    printf("%d ", a);
                                    printf("%d\n", b);
                                    printf("%d ", z - c - d);
                                    printf("%d ", c);
                                    printf("%d\n", d);
                                    printf("%d ", z - b - c);
                                    printf("%d ", z - a - c);
                                    printf("%d\n", z - b - d);
                                    printf("\n\n");
                                    n++;
                                    //if (n == 8) return ;
                                }
                            }
                    }
                }
            }
        }
    
    }
    void exit()
    {
        exit(0);
    }
    int main()
    {
        menu();
        int choice;
        printf("请输入选项:\n");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            odd();
            break;
        case 2:
            prime();
            break;
        case 0:
            exit();
            break;
        default:
            printf("输入无效\n");
            break;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月15日
  • 已采纳回答 6月7日
  • 创建了问题 6月7日

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)