Project Euler 51 Prime digit replacements(枚举)

Project Euler 1-50小结 本人大一菜狗,趁着寒假没什么事可做,兴致勃勃的刷起了ProjectEuler。Project Euler上的编程题大部分都是数学题,只需要提交一个答案就好(这有别于其它OJ,我喜欢这一点,因为这样在程序里就不用考虑特殊的输入输出),当然你也可以选择用数学知识来笔算得出答案,不管用什么方法,提高能力才是根本的目的。刷完前50题,对某些题还是有所收获有所感触的,记录下来,以便日后翻看。 Proble 阅读详情

超级传送门:http://projecteuler.net/problem=51

 

这题我是暴力枚举的,O3优化后2秒多。

先枚举素数,再枚举要替换的位置,我用二进制来表述,设dc为当前枚举到素数的位数,则替换方法可以从1 ~ (1 << dc),若某一个二进制位为1,则表示该素数对应的位置需要替换,最后再枚举要替换成的新值,判断新生成的数是否是素数,并记录由同一个素数替换而成的新素数个数。

 

代码如下:

 

#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

int p[100010];
int pIndex = 0;

inline int isPrime(int x)
{
    if (x <= 1)
        return 0;
    int m = (int)sqrt(x);
    for (int i = 2; i <= m; i++)
    {
        if (!(x % i))
            return 0;
    }
    return 1;
}

inline void genPrimeTable(int upBound)
{
    for (int i = 2; i <= upBound; i++)
    {
        if (isPrime(i))
            p[pIndex++] = i;
    }
}

inline int calcDigitsCount(int x)
{
    int ans = 0;
    while (x)
    {
        ans++;
        x /= 10;
    }
    return ans;
}

inline int replaceDigit(int x, int pos, int newVal)
{
    char buffer[15];
    sprintf(buffer, "%d", x);
    buffer[pos - 1] = newVal + '0';
    sscanf(buffer, "%d", &x);
    return x;
}

inline int calcMaxPrimeFamilyMemberCount(int x)
{
    int dc = calcDigitsCount(x);
    int retVal = 0;

    for (int i = 1; i < (1 << dc); i++)
    {
        int ans = 0;

        char bufferX[15];
        sprintf(bufferX, "%d", x);
        int preTestI = i;
        int hash[10];
        memset(hash, 0, sizeof(hash));

        for (int k = 1; k <= dc; k++)
        {
            int flag = preTestI & 0x1;
            preTestI >>= 1;

            if (flag)
                hash[bufferX[k - 1] - '0'] = 1;
        }

        int sum = 0;
        for (int k = 0; k <= 9; k++)
            sum += hash[k];
        if (sum != 1)
            continue;

        for (int newVal = 9; newVal >= 0; newVal--)
        {
            if ((i & 0x1) && !newVal)
                continue;

            int tmpRes = i;
            int tmpX = x;

            for (int j = 1; j <= dc; j++)
            {
                int flag = tmpRes & 0x1;
                tmpRes >>= 1;

                if (flag)
                    tmpX = replaceDigit(tmpX, j, newVal);

            }
            if (isPrime(tmpX))
                ans++;
        }

        retVal = retVal > ans ? retVal : ans;
    }

    return retVal;
}

int main()
{
    genPrimeTable(200000);

    int ans = 0;

    for (int i = 0; i < pIndex; i++)
    {
        int res = calcMaxPrimeFamilyMemberCount(p[i]);

        if (res == 8)
        {
            ans = p[i];
            break;
        }
    }
    printf("%d\n", ans);

    return 0;
}

ProjectEuler:我的欧拉计划答案 欧拉计划 我的欧拉计划答案 立即下载

相关推荐

微信自动化必备软件:inspect(获取微信界面元素)

SaveButton10015.2:1 ✅(合格)Passed ✅说明这个控件完全符合无障碍标准。

Ven%的博客 1382

Project Euler Problem 51

Problem 51By replacing the 1st digit of the 2-digit number *3, it turns out that six of the nine possible values: 13, 23, 43, 53, 73, and 83, are all prime.By replacing the 3rd and 4th digits of 56**3...

wxinbeings的博客 297

一起学习Avalonia(十三)

Avalonia 前面已经简单介绍了一下相关开发,有一个系统的了解。 到今天Avalonia已经基本成熟,但是扩展支持的还是不可能达到大企业的,我估计这也不可能。考虑了下,微软的MAUI框架可能会普及性更高,Avalonia也是我无意间知道的。 微软毕竟是会宣讲的全球。并且微软全球研发投入很大,全部专职开发,这种速度当然大。但是MAUI根据计划,可能还要很长时间,而且是社区支持Linux,估计时间更久。这不能适应现在的国产化开发。 预计一段时间还是需要Avalonia作为优先。当前Avalonia使

jinyuttt的专栏 4086

欧拉计划 Project Euler 51(素数数字替换) 题解

将五位数 56**3 的第三和第四位数字替换为相同的任意数字,在十个可能值中有七个是素数,这也是同类例子中最小的一个。这些素数分别是:56003、56113、56333、56443、56663、56773 和 56993。56003 作为其中最小的数,也就是最小的满足这个性质的素数。将两位数 *3 的第一位数字替换为任意数字,在九个可能值中有六个是素数:13、23、43、53、73 和 83。通过将部分数字(不一定相同的)替换为相同的任意数字,有时能够得到八个素数,求满足这一性质的最小素数。

m0_53387935的博客 289

厉害了,华为推出下一代光传送网:fgOTN

2024年10月,在全球信息技术博览会(GITEX Global 2024)上,华为正式发布了其颠覆性的创新产品——端到端细粒度光传送网(fgOTN)解决方案。这一产品组合被誉为行业内首个fgOTN,旨在重塑光传送网络的格局,满足电力运输等行业日益增长的通信需求。在过去的近三十年中,同步数字体系(SDH)技术一直是电信和工业网络的支柱,因其可靠性、稳定性和低延迟而备受青睐。然而,随着数据需求的激增,SDH的最大带宽仅为10 Gbps,逐渐显露出局限性。

网络技术联盟站 636

【STM32 Blue Pill编程】-STM32CubeIDE开发环境搭建与点亮LED

本文为使用 STM32Cube IDE 的 STM32 Blue Pill 入门教程。 在本文中,我们将介绍如何控制 STM32 Blue Pill 的 GPIO 引脚。以及开发环境搭建。 本系列文章将重点介绍采用 ARM Cortex-M 的 BluepellSTM32F103C8 微控制器以及如何使用 STM32CubeIDE 对其进行编程。 STM32CubeIDE是STM32官网提供的IDE

视觉与物联智能 1070

欧拉工程第51题:Prime digit replacements

题目链接 题目: 通过置换*3的第一位得到的9个数中,有六个是质数:13,23,43,53,73和83。 通过用同样的数字置换56**3的第三位和第四位,这个五位数是第一个能够得到七个质数的数字,得到的质数是:56003, 56113, 56333, 56443, 56663, 56773, 和 56993。因此其中最小的56003就是具有这个性质的最小的质数。 找出最小的质数,通过用同样...

weixin_34290631的博客 215

Linux 命令行的艺术

Linux 命令行的艺术前言基础日常使用文件及数据处理系统调试单行脚本冷门但有用仅限 OS X 系统仅限 Windows 系统更多资源免责声明熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练...

AI天才研究院 9282

Project Euler 第51题 Prime digit replacements

题目来源ProjectEuler 这个题先定义并解释了 x prime value family,指的是一个素数,通过将若干个数字相同的位替换为其他数字,得到的最多10个数中,仍然为素数的这些数组成的集合,比如13,将1替换成其他数字,得到23,33,43,53,63,73,83,93,加上13总共9个数,其中有13,23,43,53,73,83这六个数是素数,这就构成了一个6 prime va

PFCC的博客 659

1.嵌入式控制器EC学习,编译环境搭建

工欲善其事,必先利其器。 在学习EC相关知识之前,首先需要完成EC代码编译环境的搭建,需要如下内容: Keil C51(用于EC中C代码的编译器环境) EC源代码,我们使用从网上可以下载到的 ITE_V12.4_Update 版的代码为例进行学习 代码编辑器,这个可以根据自己的习惯选择,VS Code或者Source Insight等 Keil C51下载地址: http://www.downcc.com/soft/307131.html 下载完成后请进行破解 EC源代码 ...

qq_30135687的博客 3918

SAP UI5 和 Fiori 的一些小技巧合集 - 持续更新中

本文介绍笔者从事 SAP UI5 和 Fiori 开发多年以来,积累的一些经验和小技巧。会保持更新。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 913

Project Euler Problem 51:Prime digit replacements【暴力】【按位枚举】【stringstream】

PE其他解题报告请参考这里,本题答案在留言首条 Prime digit replacements Problem 51 By replacing the 1st1^{st}1stdigit of the 2-digit number *3, it turns out that six of the nine possible values: 13, 23, 43, 53, 73, and 83,...

nobleman 841

手把手教你学simulink(40.1)--水力发电场景示例:基于 Simulink 的抽水蓄能电站水力发电

项目背景抽水蓄能电站是一种重要的储能技术,广泛应用于电力系统的调峰填谷、频率调节和备用电源。它通过在电力负荷低谷时将水从下水库抽到上水库储存,在电力负荷高峰时释放水进行发电,从而实现电能的高效利用。与传统的水电站不同,抽水蓄能电站可以在短时间内快速响应电网的需求,具有良好的灵活性和可靠性。本项目旨在使用 MATLAB/Simulink 模拟一个完整的抽水蓄能电站的水力发电过程,包括水泵-涡轮机系统、发电机、水道系统、控制系统等,并实现对电站的精确控制,确保其在不同工况下都能稳定运行。

MHD0815的博客 886

Project Euler:Problem 51 Prime digit replacements

By replacing the 1st digit of the 2-digit number *3, it turns out that six of the nine possible values: 13, 23, 43, 53, 73, and 83, are all prime. By replacing the 3rd and 4th digits of 56**3 with th

312小公举的专栏 877

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Project Euler Problem 51 (C++和Python)

Problem 51: Prime digit replacements By replacing the 1st digit of the 2-digit number *3, it turns out that six of the nine possible values: 13, 23, 43, 53, 73, and 83, are all prime. By replacing the...

jiafengfu的优快云博客 361

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

project euler 51

Problem 51 Prime digit replacements By replacing the 1st digit of the 2-digit number *3, it turns out that six of the nine possible values: 13, 23, 43, 53, 73, and 83, are all prime. By r

whuawell的博客 581

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Project Euler Problem 51-70

题目翻译是从 欧拉计划 | Project Euler 中文翻译站上面Copy 的 Problem 51 Prime digit replacements 通过置换*3的第一位得到的9个数中,有六个是质数:13,23,43,53,73和83。 通过用同样的数字置换56**3的第三位和第四位,这个五位数是第一个能够得到七个质数的数字,得到的质数是:56003, 56113, 56333, 56

柯安的专栏 2726

Project Euler 51

这题……终于遇到让我非常困惑的题了…… 因为这道题不能让我找到一个效率高的处理方式…… 只能说,自己对python,或者对C还是不够熟练…… 简单地说,我用的还是迭代加深搜索,枚举替换的位数(*的个数),搜索出所有可能的位置组合。 然后用0~9换进去,检查是否是prime 听上去挺简单,写起来却挺麻烦…… import sys import date

lushl9301的专栏 828

Project Euler problem 51

这题的话。。还是有点细节问题需要注意的 我刚开始猜测这个数可能是6位数 所以我就从10W开始枚举素数 然后,首先,个位数是不能被换的。 因为一换之后肯定不到8个素数了,光偶数都好几个了 然后说了可以不相邻的数来回换。 那么你就枚举呗。 注意的是,你要是能换出来一个比我们枚举的那个素数要小的素数的话。 注意。。换出来小的数是可以的,但是比他小的素数是不可以的。 所以。。

水 826

欧拉计划 Problem 18

题目 最大路径和 I 从下面展示的三角形的顶端出发,不断移动到在下一行与其相邻的元素,能够得到的最大路径和是23。 3 7 4 2 4 6 8 5 9 3 如上图,最大路径和为 3 + 7 + 4 + 9 = 23。 求从下面展示的三角形顶端出发到达底部,所能够得到的最大路径和: 75 95 64 17 47 82 18 35 87 10 20 04 82 47 65

戎码一生的博客 560

百度2012年校招笔试题——pszStringRotate

百度2013校园招聘笔试题 算法与程序设计 第4题:          字符串左移,void *pszStringRotate(char *pszString, int nCharsRotate),比如ABCDEFG,移3位变DEFGABC,要求空间复杂度O(1),时间复杂度O(n)。         字符串位移,再简单不过了,方法也很多. 有朴素算法(逐位移动,移动nCharsRotat

Uranux 3073

Project Euler 26 Reciprocal cycles(计算有理小数循环节长度)

超级传送门:http://projecteuler.net/problem=26 算法的核心思想:在除法过程中如果某一状态的除数与被除数和前面某一状态的相等,则后续的除法计算陷入循环,循环节长度就是这两个状态的距离。 例子:计算1/7的循环节长度 状态1: 10/7  得1余3 状态2: 30/7  得4余2 状态3: 20/7  得2余6 状态4: 60/7  得8余4 状

Uranux 1639

HDOJ 2852 KiKi's K-Number(树状数组)

超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2852 题意:有一个容器里有m个数(1 分析:用树状数组来维护这个容器,每次查找用二分。 代码: #include #include using namespace std; const int maxn = 100010; int c[maxn]; int n; in

Uranux 1600

POJ 2185 Milking Grid(二维KMP)

超级传送门:http://poj.org/problem?id=2185 这道题网上很多其他的blog上的题解都是错的,由于题目自身数据比较水,便都混过去了。其中一种典型的错误解法是求出每一行/列的最小覆盖长度(ABCAB的最小覆盖长度就是3,即对应ABC),然后LCM,若结果大于串长,则取串长。这是一种典型的错误贪心,诸如: 2 8 ABCDEFAB AAAABAAA 这组数据

Uranux 1232

ZOJ 3430 Detect the Virus(AC自动机+解码)

超级传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3430 本题思路清晰,不过解码确实繁琐,看来自己代码能力还有待加强。 需要注意几个点:解码后的ASCII字符的范围是0~255,而且可能包含'\0',不能用char来存,最好用int。 代码: #include #include #

Uranux 1096
上一篇: Project Euler 38 Pandigital mutiples(枚举)
下一篇: Project Euler 54 Poker hands(模拟+hash)
Uranux
博客等级 码龄15年 16粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值