Euler Project解题汇总 031 ~ 040

  考虑到以后的题目难度会越来越大,某些题目我会加上[color=red]题目分析[/color],对解题方法进行简单的提示。

[url=http://projecteuler.net/index.php?section=problems&id=31]问题31[/url]:[color=orange]Investigating combinations of English currency denominations.[/color]
[color=red]题目简介[/color]:英国的货币有便士(p)与英镑(£)两种,有以下8种常见的面值:
   1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).
2英镑的总值可能是如下的一种组合方式:
  1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p
现在要求总值为两英镑的所有可能的组合方式数。
[color=red]题目分析[/color]:这是典型的动态规划(DP)题,不过这里数据量很小,直接暴力之。
[color=red]答 案[/color]:73682
// Scala
def ways(c:Int,ls:List[Int]):Int =ls match{
case Nil => if(c == 0) 1 else 0
case x::xs => 0.to(c/x).foldLeft(0){ (s,n) => s+ways(c-x*n,xs) }
}
ways(200,200::100::50::20::10::5::2::1::Nil)



[url=http://projecteuler.net/index.php?section=problems&id=32]问题32[/url]:[color=orange]Find the sum of all numbers that can be written as pandigital products.[/color]
[color=red]题目简介[/color]: 数字7254有着特殊的性质:
       39×186 = 7254
可以看到,乘数,被乘数与乘积连起来恰好是数字1到9的一个排列(391867254)。
现在求所有数c的和,其中c满足存在a,b使得a×b=c,且a,b,c连起来为123456789的一个排列。
[color=red]题目分析[/color]:简单的分析后可以知道数c只可能是一个4位数(why?自己想-_-)。然后就可以暴力之~
[color=red]答 案[/color]:45228
// Scala
//a,b,c是否恰为123456789的一个排列
def suit(a:Int,b:Int,c:Int):Boolean ={
var fs =new Array[Boolean](10)
def test(n:Int){
var t =n
while(t != 0){
fs(t%10) =true
t = t/10
}
}
test(a)
test(b)
test(c)
fs.slice(1,10).forall(_==true)
}
1234.to(9876).filter{ n =>
2.to(Math.sqrt(n)).filter{ n%_==0 }.exists{ k => suit(k,n/k,n) }
}.foldLeft(0){ _+_ }



[url=http://projecteuler.net/index.php?section=problems&id=33]问题33[/url]:[color=orange]Discover all the fractions with an unorthodox cancelling method.[/color]
[color=red]题目简介[/color]: 49/98 = 4/8
  上面的分数化简是正确的,但一个没有学过数学的人可能会误以为是将分子与分母中的9同时消去得到的。这样的理解是错误的,但这儿确实有一些分数ab/bc,它的值与a/c相等。现在要求所有这样的分数(小于1)的积化成最简形式后分母的值。

[color=red]题目分析[/color]:略
[color=red]答 案[/color]:100
// Scala
def gcd(a:Int,b:Int):Int =if(a==0) b else gcd(b%a,a)
var ls = for{ a <- 1 to 9
b <- 1 to 9
c <- 1 until b
if 9*b*c+a*b == 10*a*c
} yield (c,b)
var (a,b) = ls.foldLeft(Pair(1,1)){(p,v) =>(p._1*v._1,p._2*v._2)}
var res = b/gcd(a,b)


[url=http://projecteuler.net/index.php?section=problems&id=34]问题34[/url]:[color=orange] Find the sum of all numbers which are equal to the sum of the factorial of their digits.[/color]
[color=red]题目简介[/color]:求所有能表示为其各位数字的阶乘的和的数。
[color=olive]譬如:145 = 1! + 4! + 5! [/color]
[color=red]注意:[/color]虽然1! = 1, 2! = 2 ,但这两个数不包括在内。
[color=red]题目分析[/color]:关键是算出这种数的一个上界。
    [color=olive]PS:比较意外的是,即便包括1,2在内,满足条件的这种数一共才4个[/color]
[color=red]答 案[/color]:40730
// Scala
object Euler034 extends Application {
var fac = Array.range(0,10).map{ n => 1.to(n).foldLeft(1){ _*_ } }
var res = 0
for(n <- 10 to 7*fac(9)){
var sum = n.toString.foldLeft(0){ (s,i) => s+fac(i-'0') }
if(sum == n) res += n
}
println(res)
}



[url=http://projecteuler.net/index.php?section=problems&id=35]问题35[/url]:[color=orange]
How many circular primes are there below one million?[/color]
[color=red]题目简介[/color]:197被称为环形素数(circular prime),这是因为它所有的轮换:197, 971, 719都是素数。求1,000,000以内环形素数的个数。
[color=red]题目分析[/color]:略
[color=red]答 案[/color]:55
// Scala
import java.util.Arrays.{binarySearch => find}
import java.util.BitSet
import scala.collection.jcl.LinkedList

object Euler035 extends Application{
/**
得到小于bound的素数从小到大组成的Array
Sieve of Eratosthenes
*/
def takePrime(bound:Int):Array[Int] = {
if(bound <= 2) return Array()
var set = new BitSet(bound)
var idx = 2
var lst = new LinkedList[Int]
lst.add(2)
while(idx < bound){
var sp = lst.last
var st = sp*2
while(st <= bound){
set.set(st)
st += sp
}
st = sp+1
while(st < bound && set.get(st)) st += 1
if(st < bound) lst.add(st)
idx = st
}
lst.toArray
}
val pa = takePrime(1000000)
val po = Array(1000000,100000,10000,1000,100,10,1)

def suit(p:Int):Boolean ={
var pow = po.find{_<p}.get
var cpy = p
do{
cpy = cpy/10 + cpy%10*pow
if(find(pa,cpy) < 0) return false
}while(cpy != p)
true
}

var res = pa.filter{ suit _ }.length
println(res)
}



[url=http://projecteuler.net/index.php?section=problems&id=36]问题36[/url]:[color=orange]Find the sum of all numbers less than one million, which are palindromic in base 10 and base 2.[/color]
[color=red]题目简介[/color]:求1,000,000以内的10进制与2进制表示都为回文数的数之和。
[color=red]题目分析[/color]:略
[color=red]答 案[/color]:872187
// Scala
def isPalin(n:Int):Boolean ={
var cpy =n
var inv =0
while(cpy != 0){
inv = inv*10 + cpy%10
cpy = cpy/10
}
if(inv != n) return false
while(inv != 0){
cpy = cpy<<1
if((inv&1) != 0) cpy = cpy|1
inv = inv>>>1
}
cpy == n
}

1.until(1000000).filter{ n => isPalin(n) }.foldLeft(0){ _+ _}



[url=http://projecteuler.net/index.php?section=problems&id=37]问题37[/url]:[color=orange]Find the sum of all eleven primes that are both truncatable from left to right and right to left.[/color]
[color=red]题目简介[/color]:数3797有个有趣的性质:
  依次将它左边的数字一个个移去,得到:3797, 797, 97, 7
  或者从右边进行:3797, 379, 37, 3
得到的这些数都是素数。已经证明这样的数只有11个(不包括2,3,5,7)。求所有这样的数之和。
[color=red]题目分析[/color]:懒得想了,直接把35题的代码改改就行。
[color=red]答 案[/color]:748317
// Scala
import java.util.Arrays.{binarySearch => find}
import java.util.BitSet
import scala.collection.jcl.LinkedList

object Euler037 extends Application{
/**
得到小于bound的素数从小到大组成的Array
Sieve of Eratosthenes
*/
def takePrime(bound:Int):Array[Int] = {
if(bound <= 2) return Array()
var set = new BitSet(bound)
var idx = 2
var lst = new LinkedList[Int]
lst.add(2)
while(idx < bound){
var sp = lst.last
var st = sp*2
while(st <= bound){
set.set(st)
st += sp
}
st = sp+1
while(st < bound && set.get(st)) st += 1
if(st < bound) lst.add(st)
idx = st
}
lst.toArray
}
val pa = takePrime(1000000)
val po = Array(1000000,100000,10000,1000,100,10,1)

def suit(p:Int):Boolean ={
var pow = po.find{_<p}.get
var cpy = p
var cpx = p
do{
cpy = cpy%pow
cpx = cpx/10
pow = pow/10
if(find(pa,cpx) < 0||find(pa,cpy) < 0) return false
}while(pow > 1)
true
}

var res = pa.filter{ suit _ }.foldLeft(0){ _+_ }
println(res)
}



[url=http://projecteuler.net/index.php?section=problems&id=38]问题38[/url]:[color=orange]What is the largest 1 to 9 pandigital that can be formed by multiplying a fixed number by 1, 2, 3, ... ?[/color]
[color=red]题目简介[/color]:求满足下列条件的最大的那个数A:
  存在自然数数a及n(>1),使得:
    a×1 = m1
    ……
    a×n = mn
  将m1,...,mn依次相连恰好为123456789的一个排列,并且记A为连接成的那个数。
[color=olive]譬如192384576就是满足条件的一个数,因为:
  192×1 = 192
  192×2 = 384
  192×3 = 576[/color]
[color=red]题目分析[/color]:暴力是个好东东~
[color=red]答 案[/color]:932718654
// Scala
object Euler038 extends Application {
var res = "0"

def suit(s:String):Boolean = {
if(s.length != 9) return false
var fs =new Array[Boolean](10)
for(c <- s)
if(c=='0') return false
else if(fs(c-'0')) return false
else fs(c-'0') =true
true
}

for(n <- 1 until 100000){
var n2s =""
var mul =1
do{
n2s += n*mul
mul += 1
}while(n2s.length<9)
if(suit(n2s) && n2s>res) res = n2s
}
println(res)
}



[url=http://projecteuler.net/index.php?section=problems&id=39]问题39[/url]:[color=orange] If p is the perimeter of a right angle triangle, {a, b, c}, which value, for p ≤ 1000, has the most solutions?[/color]
[color=red]题目简介[/color]:1000以内,求数p使得周长为p的直角三角形的种数最多。
[color=olive]譬如周长为120的直角三角形有三种:{20,48,52}, {24,45,51}, {30,40,50}[/color]
[color=red]题目分析[/color]:略
[color=red]答 案[/color]:840
// Scala
var res =0
var max =0
for(p <- 1 until 1000){
var c =0
for{ a <- 1 until p/2
b <- 1 to a
if a*a+b*b==(p-a-b)*(p-a-b)
} c += 1
if(c > max){
max =c
res =p
}
}
res



[url=http://projecteuler.net/index.php?section=problems&id=40]问题40[/url]:[color=orange]Finding the nth digit of the fractional part of the irrational number.[/color]
[color=red]题目简介[/color]:将所有的自然数依次连起来作为小数部分做成一个无线不循环小数:
    0.12345678910[color=red]1[/color]112131415161718192021...
记该小数第n位的数字为d(n),有d(12) = 1
求: d(1)×d(10)×d(100)×d(1000)×d(10000)×d(100000)×d(1000000)
[color=red]题目分析[/color]:暴力,又见暴力~
事实上这个题有高效的算法,不过此处数据量太小,暴力足已。
[color=red]答 案[/color]:210
// Scala
var sb = new StringBuilder
var n =1
while(sb.length < 1000000){
sb.append(n)
n += 1
}
var res = 1
var idx = 1
for(i <- 0 to 6){
res = res*(sb(idx-1)-'0')
idx = idx*10
}
res
ProjectEuler题解(更新到100题) 欧拉项目题解,源代码从Github上下载:https://github.com/cloudzfy/euler Multiples of 3 and 5Even Fibonacci numbersLargest prime factorLargest palindrome productSmallest multipleSum square difference10 阅读详情

相关推荐

Euler-project:逐步提升编程技能的数学挑战

项目经验对于编程技能的提升至关重要。通过实际项目的开发,开发者可以学会如何在实际工作中应用理论知识,解决现实问题。在这个过程中,项目团队的沟通协作、代码的版本控制、以及软件的设计模式和架构都至关重要。为了积累经验,开发者应当主动寻求参与各种类型的项目,从中体验不同的开发流程和技术栈。在项目结束后,进行总结反思同样重要,这有助于识别项目中的成功点和可改进之处。例如,通过编写技术博客或者项目回顾,可以更系统地整理和分享自己的经验和教训。计算理论是研究什么问题是可计算的,以及如何计算的数学分支。

weixin_30661119的博客 1052

欧拉计划 Project Euler 8-14

Project Euler 8-14 Problem 8: Largest product in a series Str = '73167176531330624919225119674426574742355349194934\ 96983520312774506326239578318016984801869478851843\ 85861560789112949495459501737958331952853208805511\ 12540698747158523863050715693290963

weixin_42677935的博客 681

Project Euler挑战性编程练习与解题策略

本文还有配套的精品资源,点击获取 简介:项目欧拉(Project Euler)是一个提供数学和计算机科学挑战题的在线平台,旨在通过解决这些问题来提升编程技能和数学理解。问题通常涉及算法、数学建模和高效计算,有使用JavaScript和Ruby语言的解决方案。该平台的挑战包括理解基本和高级编程概念,如数据类型、数组、循环、函数、闭包、异步编程、模块化、面向对象编程、块、枚举器...

weixin_33193177的博客 1758

欧拉计划(project euler)最详细中文题解

欧拉计划是一个在线解题网站,题目以各类数学问题为主,通常需要结合一定的数学与编程知识,写出适当的程序求解问题(详细介绍可以参见我的文章)。相比于力扣等刷题网站,欧拉计划上的题目有着更丰富的知识背景,在解答题目的过程中常能学习新的数学与算法知识,享受解题愉悦的同时也能颇有收获。 在我的解题过程中,我尽量追求对每道题给出最优的解法,然后写文章把我的思路与代码记录下来。在每篇文章中,我首先将题目翻译成了中文,然后给出了我的解题思路和对应的代码,代码可以在这个仓库中找到。希望这些文章能够为大家带来启发,发现更好的

metaquant的博客 6998

探索Project Euler:Python编程与数学挑战之旅

本文还有配套的精品资源,点击获取 简介:Project Euler是一个结合数学和计算机科学的在线问题集,旨在通过编程提高问题解决能力。本项目着重于使用Python解决相关问题,涉及基础数学概念和算法设计。掌握Python编程技巧、问题解决策略、代码风格和调试是关键。参与Project Euler可以提升逻辑思维和编程技能,适合不同水平的程序员。 1. Proje...

weixin_42515842的博客 1176

Euler-Project:Project Euler(以Leonhard Euler命名)是一个致力于解决一系列打算通过计算机程序解决的计算问题的网站。 该项目吸引了对数学和计算机编程感兴趣的成年人和学生。 自2001年由科林·休斯(Colin Hughes)创立以来,欧拉计划(Project Euler)在世界范围内享有很高的知名度和知名度。 它包含700多个问题,每隔一到两周就添加一个新问题。 问题的难度各不相同,但是使用功率适中的计算机上的高效算法,每个问题都可以在不到一分钟的CPU时间内解决。

Euler-Project:Project Euler(以Leonhard Euler命名)是一个致力于解决一系列打算通过计算机程序解决的计算问题的网站。 该项目吸引了对数学和计算机编程感兴趣的成年人和学生。 自2001年由科林·休斯(Colin Hughes)创立以来,欧拉计划(Project Euler)在世界范围内享有很高的知名度和知名度。 它包含700多个问题,每隔一到两周就添加一个新问题。 问题的难度各不相同,但是使用功率适中的计算机上的高效算法,每个问题都可以在不到一分钟的CPU时间内解决。 截至2020年4月5日,欧拉计画拥有来自世界各地的超过1,000,000个用户,这些用户至少解决了一个问题。 来自维基百科的信息(https

Project Euler in Java [001-040]

无脑而暴力·打怪且升级

安如衫的刷怪之路 2044

Project-Euler:ProjectEuler +解决方案

该软件包包含我针对Euler项目问题​​的解决方案代码。 源代码包括对所涉及数学的详细说明,以证明程序中的逻辑合理。 此代码仅供“参考”。 您需要事先获得书面许可才能执行以下任何操作:逐字重新发布代码,发布经过修改的代码,将部分代码合并到您自己的工作中,等等。 版权所有:copyright:2015 Project Peeyushy95。 版权所有。 没有保修。

欧拉计划 Project Euler66(丢番图方程)题解

而对于非平方数的正整数D,佩尔方程总存在无穷多组正整数解。有了上面的结论,代码就很好写了,和之前的连分数代码差不多,具体细节看代码实现。鉴于数据量比较大,数据很容易溢出,这里用的python。的连分数展开是无限且最终是周期性的。是完全平方数时,这个方程没有正整数解。所以其他的解都可以由基本解生成。),连分数展开的周期就开始了,周期长度。是平方数时,这个方程不存在正整数解。找到佩尔方程基本解的标准方法是利用。是完全平方数时,方程变为。对于一个非平方数的正整数。是指周期部分的长度,且。

m0_53387935的博客 1091

project-euler:解决Project Euler问题的方法

描述 这些是Project Euler问题的解决方案。 在网上可以轻松找到解决方案,因此,如果您不想破坏乐趣,请不要关注这些解决方案。 随意使用代码做任何事情; 我添加了一个许可证,因此任何人都可以使用它。 用法 通过运行以下命令检查提供了哪些解决方案: make stats 一些问题需要预先计算的素数列表。 您可以通过运行以下命令下载列表: make primes 素数的默认限制为10 ^ 8,但是某些问题不需要预先计算那么多素数。 通过进入语言的子目录并运行make运行特定的解决方案,例如,要运行Racket中的问题25的解决方案,请执行以下操作: cd racket make 25 语言 球拍是我的首选语言,用该语言解决的问题将比其他任何方式都多。 球拍是唯一一贯在源头上对发生的事情有解释的语言。 Bash:GNU bash,版本3.2.39(1)-发行版(i486-pc

euler-java:Java 8 中的 Project Euler 解决方案

欧拉-java Java 8 中的 Project Euler 解决方案

Project Euler开源项目常见问题解决方案

Project Euler开源项目常见问题解决方案 项目基础介绍和主要编程语言 Project Euler 是一个开放的数学和编程挑战集合,包含了许多涉及算法和数学问题的练习。它旨在帮助编程爱好者利用编程技术解决有趣的数学问题。 本项目中的解决方案是多语言的,也就是说,一个问题可能有多种编程语言的实现。主要的编程语言包括但不限于: C/C++ Python Java C# JavaScript ...

gitblog_00354的博客 976

project-euler:Project Euler 问题的解决方案(主要使用 Java)

#Project Euler 解决方案 一些问题的解决方案。 大多数解决方案都是用Java编写的。

project euler 解题

project euler 3:Any integer greater than 1 is either a prime number, or can be written as a unique product of prime numbers (ignoring the order). 每一个数都能表示成质数的乘积。 const long numm = 600851475143; lo

cctvzxxz1的专栏 5928

Project-Euler-solutions-java:我的Java项目Euler解决方案

项目欧拉 我的Java项目Euler解决方案。 提示:如果仅从我的解决方案中复制内容,这将无助于您学习,因此,如果可以的话,请尝试理解代码背后的逻辑。 我了解我的解决方案还有改进的余地,因此,我很乐意收到有关我的代码的任何建议! 快乐的编码:)

Unity 2022.3.3 LTS + Visual Studio 2022:手把手教你复刻《吸血鬼幸存者》核心战斗(附完整项目源码)

本文详细介绍了如何使用Unity 2022.3.3 LTS和Visual Studio 2022从零构建《吸血鬼幸存者》式战斗系统。通过图文开发教程,涵盖对象池优化、ECS架构雏形、2D物理碰撞控制等关键技术,帮助开发者高效复刻这款热门游戏的自动攻击与海量刷怪机制。

weixin_30721077的博客 459

Euler Project 54

In the card game poker, a hand consists of five cards and are ranked, from lowest to highest, in the following way:High Card: Highest value card.One Pair: Two cards of the same value.Two Pairs: Two di...

weixin_42147487的博客 508

Frida实战:从adb连接到安卓设备参数加密Hook全流程解析

本文详细解析了使用Frida进行安卓应用动态分析的全流程。通过adb连接设备并部署Frida服务端,结合静态分析与动态Hook技术,精准定位并拦截关键函数,特别是针对参数加密等核心逻辑的实时监控与修改,为逆向分析与安全研究提供了高效实战方案。

weixin_29208077的博客 343
上一篇: 按字典顺序生成所有的排列
下一篇: 澄清:Java中只有按值传递,没有按引用传递!
JavaSxy
博客等级 码龄21年 1粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值