素数幻方 求四阶的素数幻方。即在一个4*4的矩阵中,每一个格填入一个数字,使每一行、每一列和两条对角线上的四个数字所组成的四位数,均为可逆素数(改数逆序后仍是素数)。 提示:这样的矩阵有很多。

简介: 素数幻方 求四阶的素数幻方。即在一个4*4的矩阵中,每一个格填入一个数字,使每一行、每一列和两条对角线上的四个数字所组成的四位数,均为可逆素数(改数逆序后仍是素数)。 提示:这样的矩阵有很多。

素数幻方


求四阶的素数幻方。即在一个4*4的矩阵中,每一个格填入一个数字,使每一行、每一列和两条对角线上的四个数字所组成的四位数,均为可逆素数(改数逆序后仍是素数)。

提示:这样的矩阵有很多。


**输出提示信息:“There are magic aquares with invertable primes as follow:\n”

**输出格式要求:“No.%d\n” “%6d”


程序运行示例如下:

There are magic aquares with invertable primes as follow:

No.1

1 1 9 3

1 0 0 9

9 2 2 1

3 1 9 1

No.2

1 1 9 3

1 0 2 1

9 0 2 9

3 9 1 1


#include <math.h>
#include <stdio.h>
int number[210][5];
int select [110];
int array[4][5];
int count;
int selecount;
int larray[2][200];
int lcount[2];
main()
{                
    int i, k, flag, cc = 0, i1, i4;
    printf("There are magic aquares with invertable primes as follow:\n");
    for (i = 1001; i < 9999; i += 2)
    {                
        k = i / 1000;
        if (k % 2 != 0 && k != 5 && num(i))
        {                
            number[count][0] = i;
            process(count++);
            if (number[count - 1][2] % 2 != 0 && number[count - 1][3] % 2 != 0
                    && number[count - 1][2] != 5 && number[count - 1][3] != 5)
                select[selecount++] = count - 1;
        }
    }
    larray[0][lcount[0]++] = number[0][0] / 100;
    larray[1][lcount[1]++] = number[0][0] / 10;
    for (i = 1; i < count; i++)
    {                
        if (larray[0][lcount[0] - 1] != number[i][0] / 100)
            larray[0][lcount[0]++] = number[i][0] / 100;
        if (larray[1][lcount[1] - 1] != number[i][0] / 10)
            larray[1][lcount[1]++] = number[i][0] / 10;
    }
    for (i1 = 0; i1 < selecount; i1++)
    {                
        array[0][0] = select[i1];
        copy_num(0);
        for (array[1][0] = 0; array[1][0] < count; array[1][0]++)
        {                
            copy_num(1);
            if (!comp_num(2))
                continue;
            for (array[2][0] = 0; array[2][0] < count; array[2][0]++)
            {                
                copy_num(2);
                if (!comp_num(3))
                    continue;
                for (i4 = 0; i4 < selecount; i4++)
                {                
                    array[3][0] = select[i4];
                    copy_num(3);
                    for (flag = 1, i = 1; flag && i <= 4; i++)
                        if (!find1(i)) flag = 0;
                    if (flag && find2())
                    {                
                        printf("No.%d\n", ++cc);
                        p_array();
                    }
                }
            }
        }
    }
}                
num(int number)
{                
    int j;
    if (!ok(number)) return(0);
    for (j = 0; number > 0; number /= 10)
        j = j * 10 + number % 10;
    if (!ok(j)) return(0);
    return(1);
}                
ok (int number)
{                
    int i, j;
    if (number % 2 == 0) return(0);
    j = sqrt((double)number) + 1;
    for (i = 3; i <= j; i += 2)
        if (number % i == 0)return(0);
    return(1);
}                
process(int i)
{                
    int j, num;
    num = number[i][0];
    for (j = 4; j >= 1; j--, num /= 10)
        number[i][j] = num % 10;
}                
copy_num(int i)
{                
    int j;
    for (j = 1; j <= 4; j++)
        array[i][j] = number[array[i][0]][j];
}                
comp_num (int n)
{                
    static int ii;
    static int jj;
    int i, num, k, *p;
    int *pcount;
    switch (n)
    {                
    case 2:
        pcount = &lcount[0];
        p = &ii;
            break;
    case 3:
        pcount = &lcount[1];
        p = &jj;
        break;
    default:
        return(0);
    }
    for (i = 1; i <= 4; i++)
    {                
        for (num = 0, k = 0; k < n; k++)
            num = num * 10 + array[k][i];
        if ( num <= larray[n - 2][*p] )
            for (; *p >= 0 && num < larray[n - 2][*p]; (*p)--)
                ;
        else
            for (; *p < *pcount && num > larray[n - 2][*p]; (*p)++);
        if ( *p < 0 || *p >= *pcount )
        {                
            *p = 0;
            return(0);
        }
        if ( num != larray[n - 2][*p] )
            return(0);
    }
    return(1);
}                
find1 (int i)
{                
    int num, j;
    for (num = 0, j = 0; j < 4; j++ )
        num = num * 10 + array[j][i];
    return (find0(num));
}                
find2(void)
{                
    int num1, num2, j, i;
    for (num1 = 0, j = 0; j < 4; j++)
        num1 = num1 * 10 + array[j][j + 1];
    for (num2 = 0, j = 0, i = 4; j < 4; j++, i--)
        num2 = num2 * 10 + array[j][i];
    if (find0(num1))
        return(find0(num2));
    else return(0);
}                
find0 (int num)
{                
    static int j;
    if (num <= number[j][0])
        for (; j >= 0 && num < number[j][0]; j--);
    else
        for (; j < count && num > number[j][0]; j++);
    if (j < 0 || j >= count)
    {                
        j = 0;
        return(0);
    }
    if (num == number[j][0])
        return(1);
    else return(0);
}                
p_array(void)
{                
    int i, j;
    for (i = 0; i < 4; i++)
    {                
        for (j = 1; j <= 4; j++)
            printf("%6d", array[i][j]);
        printf("\n");
    }
}
相关文章
|
Web App开发 安全 物联网
常见物联网操作系统介绍
物联网操作系统是运行在物联网设备上的提供物物相连能力的操作系统,其核心在于能够将各种物体连接到互联网,并提供数据通信能力。
3817 1
|
安全 数据库 UED
无影云桌面
无影云桌面
30544 0
|
监控 网络协议 安全
即时通讯技术文集(第6期):移动端弱网优化文章汇总 [共13篇]
为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第6 期。
478 0
即时通讯技术文集(第6期):移动端弱网优化文章汇总 [共13篇]
|
机器学习/深度学习 自然语言处理 算法
Python数据分析(4):jieba分词详解
Python数据分析(4):jieba分词详解
1317 0
Python数据分析(4):jieba分词详解
|
存储 JSON 小程序
零基础入门低代码后端开发,只需几行代码就可以操作数据库
零基础入门低代码后端开发,只需几行代码就可以操作数据库
零基础入门低代码后端开发,只需几行代码就可以操作数据库
|
Java
证券量化交易平台-接入业务:SpringBoot 集成Apama
什么是APAMA, 中国银河证券与Progress® Apama®公司联手打造的国内顶尖量化交易平台,内置强大的下单工具、和程序化交易功能。满足您多品种、多周期等交易需求。
914 0
证券量化交易平台-接入业务:SpringBoot 集成Apama
|
存储 编解码 缓存
带你走进多媒体世界:视频文件是怎么播放出来的
本文将聚焦在说明多媒体世界中的视频文件是怎么播放出来的。一个多媒体文件播放涉及到哪些过程?人体通过肉眼看到画面、通过耳朵听到视频声音,这中间经过了哪些处理?本文将尽可能通过简单易懂的文字讲述一个视频文件的播放流程。
带你走进多媒体世界:视频文件是怎么播放出来的
|
XML JSON 搜索推荐
来看看Android获取定位到底有几种方式?
目前,移动端大致通过三种方式来进行设备定位:GPS、基站、wifi。本文就详细的讲解一下这几种定位方式和实现方法。
4263 0
|
存储 移动开发 安全
Android微信支付和支付宝支付快速接入
创建应用并获取APPID 开发者中心中创建您的应用,会为您生成应用唯一标识(APPID),并且可以申请开通开放产品使用权限,通过APPID您的应用才能调用开放产品的接口能力。在“我的应用”中按下图方式查看APPID。
1091 0
Android微信支付和支付宝支付快速接入
|
机器学习/深度学习 人工智能 并行计算
快速上手!实现经典检测网络 Mask R-CNN 的推理
简单来说,用 OpenMMLab 开发的模型,可以通过 OpenPPL 高效可靠地运行在现有的 CPU、GPU 等计算平台上,为云端场景提供人工智能推理服务。
575 0
快速上手!实现经典检测网络 Mask R-CNN 的推理