Project Euler 38 Pandigital mutiples(枚举)

Project-Euler problem 1-50 最近闲的做了下Project Euler 上的题目,前面50题都比较简单,简单总结下,一下代码一般是Python和C/C++的 用Python 做这些题目简直是酸爽啊 一下代码可能不一定是我的,因为不知道论坛里面的回复不是永久的,所以我的代码有的丢了,可能找个和我的意思相近的代码。题目翻译是从 欧拉计划 | Project Euler 中文翻译站上面Copy 的表告我。 Prob 阅读详情

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


枚举每个排列,分别判断是否合法,最大的排列即为答案。

注意从918273645开始枚举即可,因为这是题目中告诉的一组解,要找比这组解更大的才行。

先枚举n的值,从2到9,再枚举要乘的那个数,记为x,枚举x的位数即可,1~4,x的位数不可能大于4,如果大于4,那么2x的位数必然也大于4,组合起来长度会大于9,故不合法。

比如918273645,可以这样枚举x:先枚举x=9,然后x=91,然后x=918,然后x=9182,就够了。

枚举完x就可以对x试乘2~n,每次乘完与原串匹配一下,记下原串匹配成功的位置cntMatchIndex,发现某处不匹配即刻终止对此x的试乘。

最后如果cntMatchIndex为9,则该串合法。


代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

char num[] = "918273645";

int isValid(char *num)
{
    char buffer[15];
    int x = 0;
    int cntMatchIndex = 0;

    for (int n = 2; n <= 9; n++)
    {
        x = 0;
        for (int i = 0; i < 4; i++)
        {
            x *= 10;
            x += num[i] - '0';
            cntMatchIndex = i + 1;

            int ok = 1;
            for (int j = 2; j <= n && ok; j++)
            {
                int y = j * x;
                sprintf(buffer, "%d", y);
                int len = strlen(buffer);

                if (cntMatchIndex + len > 9)
                    break;

                for (int bIndex = 0; bIndex < len; bIndex++)
                {
                    if (buffer[bIndex] != num[cntMatchIndex++])
                    {
                        ok = 0;
                        break;
                    }
                }
            }
            if (ok && cntMatchIndex == 9)
                return 1;
        }
    }
    return 0;
}

int main()
{
    char ans[15];
    do
    {
        if (isValid(num))
            strcpy(ans, num);
    } while (next_permutation(num, num + 9));
    printf("%s\n", ans);

    return 0;
}


Android 12.0 以太网和wifi共存的产品wifi优先级设置功能实现 在12.0的系统ROM定制化开发中,在对于一些有线网和wifi共存的产品中,由于某些产品的特殊要求首选使用wifi,而在原生 系统中以太网的优先级高于wifi的,所以就需要从优先级的设置来分析,实现设置优先级的相关功能实现 阅读详情

相关推荐

Ubuntu安装ToDesk远程控制软件

前几天有同学问我怎么在 Ubuntu 系统上安装 ToDesk 远程控制软件, 帮他安装完成后就 顺手整理了一下安装过程,所以就顺手有了这篇在 Ubuntu 系统上安装 todesk 的文章。

小白的博客 8659

Project Euler 第38题

Take the number 192 and multiply it by each of 1, 2, and 3: 192 × 1 = 192 192 × 2 = 384 192 × 3 = 576 By concatenating each product we get the 1 to 9 pandigital, 192384576. We will call 192384...

Lam Peter's blog 205

VBA一键汇总多个工作簿-名称相同的工作表-的指定区域数据

VBA一键汇总多个工作簿-名称相同的工作表-的指定区域数据 日常工作,我们经常需要汇总相同格式的工作簿的某个工作表的数据 如1月业绩、2月业绩。。。。12月业绩等 姓名 数量 数据22 22 数据23 23 数据24 24 数据25 25 数据26 26 数据27 27 数据28 28 数据29 29 数据30 30 数据31 31 数据32 32 数据33 33 数据34

陈表达的博客 5981

Project Euler 38 Pandigital multiples

题意: 将192分别与1、2、3相乘: 192 × 1 = 192192 × 2 = 384192 × 3 = 576 连接这些乘积,我们得到一个1至9全数字的数192384576。我们称192384576为192和(1,2,3)的连接乘积。 同样地,将9分别与1、2、3、4、5相乘,得到1至9全数字的数918273645,即是9和(1,2,3,4,5)的连接乘积。 对于n &g...

dijingzhou4259的博客 198

python docx设置标题中文字体rPr.rFonts.set(qn(‘w:eastAsia‘),u‘黑体‘),报错‘NoneType‘ object has no attribute ‘set‘

一、我的代码: 因为要编一个报告自动化生成的代码,所以用了python docx,在设置标题自己写了一段代码,要求将标题设置成:一级标题 黑体 小四 from docx import Document from docx.oxml.ns import qn from docx.shared import Pt def add_Head(document, level, text, font, size): # document word对象 # level 几级标题 # text 标题内容 # f

qq_40272386的博客 8854

【Flink】状态编程: 订单超时告警

文章目录一、基础概念二、Flink状态编程1、支持的状态类型2、Managed Keyed State六种类型基本API状态的生命周期3、Managed Operator State三、案例:订单延迟告警统计1、需求描述2、需求分析3、数据与模型4、详细实现 一、基础概念 在Flink架构体系中,有状态计算可以说是Flink非常重要的特性之一。 有状态计算是指: 在程序计算过程中,在Flink...

一只皮皮熊 2862

Project Euler problem 38

这题主要看观察能力 他要找最大的。 就得比题目给的那个要大 给的是9开头的。 所以呢。要找的肯定也是9开头的。 首先看90几行不,乘1乘2乘3后发现位数不能到9位 再看900多 再看9000多 发现9000多有可能行 乘以2后是5位数 然后凑一块就是个9位数 然后枚举9000多就行了 #include #include #include #includ

水 598

Python爬虫实战:绕过B站-352风控的完整解决方案

网络爬虫技术是数据采集和自动化测试的重要工具,其核心原理是通过模拟HTTP请求获取网页数据。在实践过程中,开发者常会遇到网站反爬机制,这涉及请求指纹识别、IP行为分析等安全技术。这些风控措施的价值在于保护网站数据安全和服务器资源,广泛应用于电商、社交、内容平台等场景。针对B站等平台的-352风控错误,需要综合运用请求头伪装、会话管理、参数签名破解等技术方案。本文重点探讨如何通过构建完整的浏览器级请求头、管理Cookie会话、以及使用Playwright等浏览器自动化工具,有效解决Python爬虫在B站数据采

weixin_33912638的博客 391

Project Euler 38

啊……今天高产咩? 好吧~这道题依旧比较简单,只是要求输入是算出来的9XXXXXX,不是那个9327... 嗯……这不是重点,重点在于,这道题可以用数学方法手算~ anyway~ 上代码,很简单的~ def main(): max = 0 for i in range(193, 100000): num_set = list(str(i)+str(i*

lushl9301的专栏 422

从0玩转Mamba神经网络:理论+实战的保姆级教程

Mamba神经网络是一种基于状态空间模型(SSM)的高效序列处理架构,相比Transformer具有更快的推理速度和更低的内存消耗。本文提供从理论到实践的完整指南,详细讲解Mamba的工作原理、与Transformer的差异,并给出基于PyTorch的文本分类实战示例。教程包含环境配置、数据处理、模型搭建、训练评估全流程,展示了Mamba在IMDb情感分析任务中的应用。文章还探讨了Mamba的性能优势及进阶方向,为开发者提供了探索这一新兴技术的实用指南。通过阅读本文,读者可以快速掌握Mamba的核心概念并上

FJN110的博客 316

使用Simulink对液流电池在微电网中的动态响应进行建模与仿真

本文介绍了使用Simulink对液流电池在微电网中的动态响应进行建模与仿真的方法。通过搭建包含液流电池、双向DC-DC变换器、分布式能源和负载的微电网模型,并设计基于SOC的控制器,详细说明了从模型创建到仿真运行的完整流程。重点分析了液流电池在不同负载条件下的动态特性,评估了系统响应速度、充放电效率和稳定性等性能指标。该仿真方法为验证液流电池在微电网中的应用提供有效工具,有助于优化参数设计和提升系统可靠性。

amy_mhd的博客 136

Project-Euler-038思维

038题: 题意: 将192分别与1、2、3相乘: 192 × 1 = 192 192 × 2 = 384 192 × 3 = 576 连接这些乘积,我们得到一个1至9全数字的数192384576。我们称192384576为192和(1,2,3)的连接乘积。 同样地,将9分别与1、2、3、4、5相乘,得到1至9全数字的数918273645,即是9和(1,2,3,4,5)的连接乘积。 对于n &amp;...

Ivan_zcy的博客 604

C#与天文观测:Celestia模拟星空的奇幻之旅

Celestia就像一艘穿梭在星海中的小飞船,带领我们遨游宇宙。C#则是这艘飞船的智能导航系统,用代码指挥它飞向任何我们向往的星球或星系。首先,下载并安装Celestia,熟悉其基本操作和功能。创建一个星空目标列表,包括不同的恒星、行星和星系。// 示例:定义观察目标列表new SpaceObject("太阳"),new SpaceObject("月球"),new SpaceObject("火星")

java专栏 1456

<MEMORY>Project Euler NO38

将192与1,2,3分别相乘得到: 192 × 1 = 192 192 × 2 = 384 192 × 3 = 576 将这三个乘积连接起来我们得到一个1到9的pandigital数, 192384576。我们称 192384576是192和 (1,2,3)的连接积。 通过将9与1,2,3,4和5相乘也可以得到pandigital数:918273645,这个数是9和(1,2,3,4,5)

q2234037172的专栏 498

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Project Euler Problem 38 (C++和Python)

Problem 38 : Pandigital multiples Take the number 192 and multiply it by each of 1, 2, and 3: 192 × 1 = 192 192 × 2 = 384 192 × 3 = 576 By concatenating each product we get the 1 to 9 pandigital, 1923...

jiafengfu的优快云博客 256

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Python-Project Euler 38

from isPandigital import * max=-1 for i in range(500000):     s=''     for j in range(1,10):         s+=str(i*j)         if (isPandigital(s)==True and j>1):             print(i,' ',s)

ghghycl的专栏 458

百度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 51 Prime digit replacements(枚举)

超级传送门:http://projecteuler.net/problem=51   这题我是暴力枚举的,O3优化后2秒多。 先枚举素数,再枚举要替换的位置,我用二进制来表述,设dc为当前枚举到素数的位数,则替换方法可以从1 ~ (1   代码如下:   #include #include #include using namespace std; int p

Uranux 1086

Project Euler 13 Large sum(大数加法)

超级传送门:http://projecteuler.net/problem=13 自己写的大数加法模板,用的时候注意设定tmp数组适当的长度,避免溢出或浪费空间。 #include #include using namespace std; char num[150][51] = { "3710728753390210279879799822083759024651

Uranux 1077

Codeforces Div.2 213 C Matrix (预处理+哈希)

超级传送门:http://codeforces.com/contest/365/problem/C 这场特别遗憾,A题题意看错WA了2次,C题溢出导致没能通过系统测试,如果C题过了就能排前30。 题意是给你一个长度不超过4000的数字s,定义b[i][j]=s[i]*s[j],则可以得到一个矩阵b;又给你一个数a,求b有多少个子矩阵其和为a。 例如: 10 12345 a=10,

Uranux 1036

HDOJ 2054 A == B ?

超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2054 这道题坑特别多: 放几组数据: // 均为YES 0.0 0.00 -0 0 -0. +.0 0.1 00.10 4 4 +1 1 -1 -1.0 1.0 1.0 +.020 00.02 代码如下(主要练习string的iterator): #include #i

Uranux 929

HDOJ 1425 sort

超级传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1425 此题的特点:数据量大,但是数据的范围不大。用hash就行,hash函数就是减500000 #include int hash[1000100]={0}; int main () { int n,m,i,a,count,max,first; while (sc

Uranux 926

Project Euler 54 Poker hands(模拟+hash)

超级传送门:http://projecteuler.net/problem=54   刚看到题目描述,就联想到天津Regional的A题麻将那题,可惜没能AC,遗憾了好久。 这题比麻将那题要简单一些,规则描述比较清楚,要比较两手梭哈牌的大小,我用了hash来存牌,定义了各种判定判断函数来进行判断。 代码量还是比较大的,差不多600行,写的过程中很容易错。Unix/Linux设计思想——小即

Uranux 884
上一篇: Project Euler 26 Reciprocal cycles(计算有理小数循环节长度)
下一篇: Project Euler 51 Prime digit replacements(枚举)
Uranux
博客等级 码龄15年 16粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值