`
Eastsun
  • 浏览: 309472 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Euler Project解题汇总 031 ~ 040

阅读更多
  考虑到以后的题目难度会越来越大,某些题目我会加上题目分析,对解题方法进行简单的提示。

问题31Investigating combinations of English currency denominations.
题目简介:英国的货币有便士(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
现在要求总值为两英镑的所有可能的组合方式数。
题目分析:这是典型的动态规划(DP)题,不过这里数据量很小,直接暴力之。
答    案: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)




问题32Find the sum of all numbers that can be written as pandigital products.
题目简介: 数字7254有着特殊的性质:
       39×186 = 7254
可以看到,乘数,被乘数与乘积连起来恰好是数字1到9的一个排列(391867254)。
现在求所有数c的和,其中c满足存在a,b使得a×b=c,且a,b,c连起来为123456789的一个排列。
题目分析:简单的分析后可以知道数c只可能是一个4位数(why?自己想-_-)。然后就可以暴力之~
答    案: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){ _+_ }



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

题目分析:略
答    案: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)


问题34 Find the sum of all numbers which are equal to the sum of the factorial of their digits.
题目简介:求所有能表示为其各位数字的阶乘的和的数。
譬如:145 = 1! + 4! + 5!
注意:虽然1! = 1, 2! = 2 ,但这两个数不包括在内。
题目分析:关键是算出这种数的一个上界。
    PS:比较意外的是,即便包括1,2在内,满足条件的这种数一共才4个
答    案: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)
}



问题35
How many circular primes are there below one million?

题目简介:197被称为环形素数(circular prime),这是因为它所有的轮换:197, 971, 719都是素数。求1,000,000以内环形素数的个数。
题目分析:略
答    案: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)
}



问题36Find the sum of all numbers less than one million, which are palindromic in base 10 and base 2.
题目简介:求1,000,000以内的10进制与2进制表示都为回文数的数之和。
题目分析:略
答    案: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){ _+ _}




问题37Find the sum of all eleven primes that are both truncatable from left to right and right to left.
题目简介:数3797有个有趣的性质:
  依次将它左边的数字一个个移去,得到:3797, 797, 97, 7
  或者从右边进行:3797, 379, 37, 3
得到的这些数都是素数。已经证明这样的数只有11个(不包括2,3,5,7)。求所有这样的数之和。
题目分析:懒得想了,直接把35题的代码改改就行。
答    案: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)
}



问题38What is the largest 1 to 9 pandigital that can be formed by multiplying a fixed number by 1, 2, 3, ... ?
题目简介:求满足下列条件的最大的那个数A:
  存在自然数数a及n(>1),使得:
    a×1 = m1
    ……
    a×n = mn
  将m1,...,mn依次相连恰好为123456789的一个排列,并且记A为连接成的那个数。
譬如192384576就是满足条件的一个数,因为:
  192×1 = 192
  192×2 = 384
  192×3 = 576

题目分析:暴力是个好东东~
答    案: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)
}



问题39 If p is the perimeter of a right angle triangle, {a, b, c}, which value, for p ≤ 1000, has the most solutions?
题目简介:1000以内,求数p使得周长为p的直角三角形的种数最多。
譬如周长为120的直角三角形有三种:{20,48,52}, {24,45,51}, {30,40,50}
题目分析:略
答    案: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



问题40Finding the nth digit of the fractional part of the irrational number.
题目简介:将所有的自然数依次连起来作为小数部分做成一个无线不循环小数:
    0.123456789101112131415161718192021...
记该小数第n位的数字为d(n),有d(12) = 1
求: d(1)×d(10)×d(100)×d(1000)×d(10000)×d(100000)×d(1000000)
题目分析:暴力,又见暴力~
事实上这个题有高效的算法,不过此处数据量太小,暴力足已。
答    案: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
分享到:
评论
2 楼 run_xiao 2008-08-06  
考研的时候,跑中科院去复试,出了道题和问题31很类似,当时很傻眼,结果被K掉了,郁闷了好久
1 楼 crackerwang 2008-07-12  
en ....
这里的题目很有意思...
很久不见大哥了啊

相关推荐

    ProjectEuler 解题表格

    在提供的压缩文件“project_euler解题表格.docx”中,很可能是博主Linuke分享了他的Project Euler解题过程和经验。这个表格可能包含了他对各个问题的思考、代码实现以及解决问题所花费的时间,对于其他学习者来说是...

    Euler sums of weight 1~5.pdf

    Euler sums 是一种特殊的级数,它们涉及到对数、阶乘和特定函数的组合,主要在数学分析和数论中研究。"Euler sums of weight 1~5.pdf" 这份文档似乎提供了关于二项式Euler求和在权重1到5之间的详细公式和推导。权重...

    euler project.r.zip_R Euler project_project

    这个压缩包`euler project.r.zip_R Euler project_project`包含了R语言实现的Euler项目前14题的答案。让我们深入探讨这些题目所涵盖的知识点,并了解如何利用R语言解决这些问题。 1. **Problem 1: 多少个数小于1000...

    Euler project(1-5).zip

    这个"Euler project(1-5).zip"压缩包包含了前五个问题的MATLAB解决方案,每个问题都对应一个".mlx"文件。这些文件是MATLAB Live Scripts,是一种集代码、文本、图像和输出于一体的交互式文档格式,便于学习和理解...

    下载Project Euler题目

    标题 "下载Project Euler题目" 暗示了这个压缩包可能包含了与解决Project Euler问题相关的Java源代码。Project Euler是一个在线平台,提供了大量的数学和计算机科学问题,旨在提高编程技能和数学理解。这些问题通常...

    Project Euler_Eulerproject_fasmg_x86_windows_math_

    《使用汇编语言解决Project Euler问题的探索》 在IT领域,编程挑战是提升技能、锻炼思维的重要方式,其中Project Euler以其独特的数学与计算机科学相结合的特性,深受程序员喜爱。本项目聚焦于"Project Euler",它...

    ProjectEuler1-16代码

    【标题】"ProjectEuler1-16代码"所涉及的知识点主要集中在计算机编程和算法设计上,尤其针对初学者和编程爱好者。Project Euler是一个在线平台,它提供了一系列的数学和计算机科学问题,旨在通过解决这些问题来提升...

    Project Euler 第22题

    【标题】"Project Euler 第22题"是一个著名的编程挑战,源自Project Euler网站,这是一个鼓励人们通过编程解决数学和计算问题的在线平台。这道题目通常涉及到字符串处理、排序以及数学计算,旨在锻炼编程者的问题...

    project euler problem 5

    题目:Project Euler问题5——寻找最小公倍数 在Project Euler的问题集中,问题5要求我们找到能被1至20所有数字整除的最小正整数。这个问题实际上是在寻找这组数字的最小公倍数(LCM)。对于较小的参数值,如本例中...

    两两认识leetcode-EulerProject:数学题

    标题 "两两认识leetcode-EulerProject:数学题" 暗示了这是一个关于编程与算法的项目,特别是针对LeetCode和Euler Project的数学题目。LeetCode是一个在线平台,提供了大量的编程挑战,帮助开发者提高算法技能,而...

    EulerProject:我对Euler Project问题的个人解决方案

    Euler Project是一个在线平台,提供了一系列数学和计算机科学的挑战问题,旨在提高编程技能和解决复杂问题的能力。这些问题通常涉及到算法、数学、概率和逻辑思维等多方面知识。在这个项目中,我选择了使用C++语言来...

    project euler1.rar_ACM_project_project euler

    【项目欧拉(Project Euler)】是一个非常受欢迎的在线数学和计算机编程挑战平台,它吸引着全球的程序员和数学爱好者参与。项目欧拉的问题通常涉及数学、算法和计算机科学,鼓励解决问题并学习新技能。本压缩包...

    project euler5.rar_ACM_project

    【标题】"project euler5.rar_ACM_project" 涉及的是ACM竞赛相关的编程项目,特别是Project Euler的第五部分。Project Euler是一个在线数学和计算机科学的挑战项目,旨在提高编程技能并解决复杂的数学问题。这个...

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

    这些是Project Euler问题的解决方案。 在网上可以轻松找到解决方案,因此,如果您不想破坏乐趣,请不要关注这些解决方案。 随意使用代码做任何事情; 我添加了一个许可证,因此任何人都可以使用它。 用法 通过运行...

    Algorithm-euler_project.zip

    欧拉项目(Euler Project)是为热衷于算法和数学挑战的人们设立的一个在线平台,它提供了一系列具有挑战性的数学和计算机科学问题,鼓励参与者通过编写代码来解决这些问题,从而提升算法设计和实现能力。 **欧拉...

    project euler3.rar_ACM_project

    《ACM项目:Project Euler第三部分解题代码详解》 Project Euler是一个著名的在线数学与计算机科学问题集,旨在挑战编程者的思维能力和算法技巧。在这个压缩包"project euler3.rar_ACM_project"中,包含了10个已经...

    project_euler:Project Euler 问题的解决方案 https

    project_euler Project Euler 问题的解决方案 ###Problem 1 - 3 和 5 的倍数### 如果我们列出所有 10 以下是 3 或 5 的倍数的自然数,我们得到 3、5、6 和 9。这些倍数的和是 23。求1000 以下所有 3 或 5 的倍数之...

    ProjectEuler:projecteuler.net

    欧拉计划(Project Euler)是一个在线平台,旨在通过一系列具有挑战性的数学和计算机科学问题来提升编程技巧。这些问题设计巧妙,通常需要运用到数学、算法和编程知识来解决。参与欧拉计划,不仅可以锻炼编程能力,...

    project euler2.rar_ACM_project

    《ACM项目:Project Euler问题集解码》 在编程竞赛和算法研究领域,ACM(International Collegiate Programming Contest)项目具有极高的地位,而Project Euler则是其中一道独特的风景线。这个项目旨在挑战参赛者的...

    projecteuler:Project Euler 问题的解决方案,请参阅 https

    投影仪Project Euler 问题的解决方案,请参阅地位# 名称秒1 3 和 5 的倍数0.02 甚至斐波那契数列0.03 最大素因数0.94 最大的回文产品0.15 最小倍数2.56 和平方差0.07 第 10001 个素数0.1解决方案8 系列中最大的产品...

Global site tag (gtag.js) - Google Analytics