Prime power triples

The smallest number expressible as the sum of a prime square, prime cube, and prime fourth power is 28. In fact, there are exactly four numbers below fifty that can be expressed in such a way:

28 = 22 + 23 + 24
33 = 32 + 23 + 24
49 = 52 + 23 + 24
47 = 22 + 33 + 24

How many numbers below fifty million can be expressed as the sum of a prime square, prime cube, and prime fourth power?


素数幂三元组

最小的可以表示为一个素数的平方,加上一个素数的立方,再加上一个素数的四次方的数是28。实际上,在小于50的数中,一共有4个数满足这一性质:

28 = 22 + 23 + 24
33 = 32 + 23 + 24
49 = 52 + 23 + 24
47 = 22 + 33 + 24

有多少个小于五千万的数,可以表示为一个素数的平方,加上一个素数的立方,再加上一个素数的四次方?

解题

先求素数,筛选法求素数,题意就是 num = a^2+b^3+c^4 num《五千万,a、b、c都是素数

可以看出,a的值最大可以是sqrt(五千万),b值得最大值是五千万的立方根,c的最大值是五千万的四次方根

所以素数的个数是:sqrt(五千万)+1

下面就直接暴力求解了

注意主要:

在求 立方 和四次放的时候可能出现越界的情况,long也不可以,所以越界的时候 结果是小于0的,大于五千万的也要考虑的

还有一个就是一个数num 可能有好几种表示的形式,也就是说有重复的情况,,,由于开始没有想到重复的情况,让我看了好久才找出问题的,,题目就是的num的个数,不是求的其分解形式个数,,,所以把符合条件的数放在集合中,最后直接集合大小就是答案了。下面java程序输出结果前一个是没有去重的,后一个是去重后的才是答案的

package Level3;

import java.util.ArrayList;
import java.util.TreeSet; public class PE087{
static void run(){
int MAX = 50000000;
int limit = (int)Math.sqrt(MAX) + 1 ;
ArrayList<Integer> prime = getPrime(limit);
int count = 0;
int size = prime.size();
TreeSet<Long> set = new TreeSet<Long>();
for(int a = 0;a< size;a++){
int tmp1 = prime.get(a);
long p1 = tmp1*tmp1*tmp1*tmp1;
if(p1> MAX || p1 <0) break;
for(int b =0;b<size;b++){
int tmp2 = prime.get(b);
long p2 = tmp2*tmp2*tmp2;
if(p2> MAX || p2 <0 || p1+p2<0 || p1+p2> MAX) break;
for(int c = 0;c<size;c++){
int tmp3 = prime.get(c);
long p3 = tmp3*tmp3;
if(p3> MAX || p3 <0 || p1+p2+p3<0 || p1+p2+p3> MAX) break;
long pp = p1+p2+p3; if(pp <MAX && pp>0 && p1>0 && p2>0 && p3>0){
count++;
set.add(pp);
// if(pp<50)
// System.out.println(p1+" p2:"+p2 +" p3:"+p3+" pp:"+ pp);
}
}
}
}
System.out.println(count +"..."+set.size());
}
// 1139575...1097343
// running time=1s585ms
static boolean isPrime(int n){
if(n==2) return true;
if(n<2) return false; for(int i=2;i<=Math.sqrt(n);i++)
if(n%i==0)
return false;
return true;
}
static ArrayList<Integer> getPrime(int limit){
ArrayList<Integer> prime = new ArrayList<Integer>();
boolean isPrime = true;
prime.add(2);
for(int i=3;i<=limit;i++){
isPrime = true;
for(int j=0;j<prime.size();j++){
if(i%prime.get(j) ==0){
isPrime = false;
break;
}
}
if(isPrime == true){
prime.add(i);
// System.out.println(i);
}
} return prime;
} public static void main(String[] args){
long t0 = System.currentTimeMillis();
run();
long t1 = System.currentTimeMillis();
long t = t1 - t0;
System.out.println("running time="+t/1000+"s"+t%1000+"ms"); }
}

Python

# coding=gbk
import time as time t0 = time.time() def run():
MAX = 50000000
limit = int(MAX**0.5)
set={}
prime = getPrime(limit)
for pi in prime:
p1 = pi**4
if p1>MAX:break
for pj in prime:
p2 = pj**3
if p2>MAX:break
for pk in prime:
p3 = pk**2
if p3>MAX:break
if p1 + p2 + p3 <MAX:
set[p1+p2+p3] = 1
print len(set) #
# running time= 0.729000091553 s def getPrime(limit):
prime = [2]
isPrime = True
for i in range(2,limit):
isPrime = True
for p in prime:
if i%p==0:
isPrime = False
break
if isPrime == True:
prime.append(i)
return prime run()
t1 = time.time()
print "running time=",(t1-t0),"s"

Project Euler 87 :Prime power triples 素数幂三元组的更多相关文章

  1. Project Euler:Problem 87 Prime power triples

    The smallest number expressible as the sum of a prime square, prime cube, and prime fourth power is ...

  2. project euler 16:Power digit sum

    >>> sum([int(i) for i in str(2**1000)]) 1366 >>>

  3. Project Euler 51: Prime digit replacements

    通过替换*3这样一个两位数的第一位,我们可以发现形成的九个数字有六个是质数,即13, 23,43,53,73,83.类似的,如果我们用同样的数字替换56**3这样一个五位数的第三位和第四位,会生成56 ...

  4. Project Euler 60: Prime pair sets

    素数3, 7, 109, 673很有意思,从中任取两个素数以任意顺序拼接起来形成的仍然是素数.例如,取出7和109,7109和1097都是素数.这四个素数的和是792,是具有这样性质的四个素数的最小的 ...

  5. Python练习题 037:Project Euler 009:毕达哥拉斯三元组之乘积

    本题来自 Project Euler 第9题:https://projecteuler.net/problem=9 # Project Euler: Problem 9: Special Pythag ...

  6. Python练习题 044:Project Euler 016:乘方结果各个数值之和

    本题来自 Project Euler 第16题:https://projecteuler.net/problem=16 ''' Project Euler 16: Power digit sum 2* ...

  7. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  8. Python练习题 035:Project Euler 007:第10001个素数

    本题来自 Project Euler 第7题:https://projecteuler.net/problem=7 # Project Euler: Problem 7: 10001st prime ...

  9. Python练习题 031:Project Euler 003:最大质因数

    本题来自 Project Euler 第3题:https://projecteuler.net/problem=3 # Project Euler: Problem 3: Largest prime ...

随机推荐

  1. 【原】去掉UltraGrid第三方控件中的Drag a column header here to group by that column

  2. 【面试虐菜】—— LVS负载均衡

    Load Balancer(负载均衡器): Load Balancer是整个集群系统的前端,负责把客户请求转发到Real Server上.Load Balancer通过Ldirectord监测各Rea ...

  3. Oracle 10g下载链接

    用迅雷下载: http://download.oracle.com/otn/linux/oracle10g/10201/10201_database_linux_x86_64.cpio.gz http ...

  4. Nginx 老是抢先捕获了404 我想这个404我Yii项目来处理 要怎么配置?

    配置Nginx vhost的时候别指定error_page 它就不会跟Yii抢生意了 or 你弄一个frontendController   然后再里面 加上 $user->loginRequi ...

  5. 微软职位内部推荐-Android Developer

    微软近期Open的职位: Position: SDE II or Senior SDE -- Mobile Products Android/WP Contact Person: Winnie Wei ...

  6. JSTL标签总结

    一.JSTL简介: 1.JSP标准标签库JSTL(JSP Standard Tag Library)是一个JSP标签集合,它封装了JSP应用的通用核心功能. 2.JSTL支持通用的.结构化的任务.比如 ...

  7. Careercup - Facebook面试题 - 23594662

    2014-05-02 03:19 题目链接 原题: Given a sequence of numbers A() ..A(n), find the continuous subsequenceA(i ...

  8. 想成为真正的代码gg,目标

    转眼已而大二了,可是在这上了一个星期的课,感觉生活非常的茫然.当然这与我处在的环境有一定的关系. 处在这样的学校,想努力可是让我心凉的是没有一个老师肯真心带学生,, 学校办的各种事情都很坑,,我不怕自 ...

  9. [C#]Linq To Xml 介绍- 转

    LINQ to XML 类概述 LINQ to XML 旨在使 XML 名称尽可能简单.     XAttribute 类 XAttribute 表示一个 XML 属性. XCData 类 XCDat ...

  10. hadoop 数据采样

    http://www.cnblogs.com/xuxm2007/archive/2012/03/04/2379143.html 原文地址如上: 关于Hadoop中的采样器 .为什么要使用采样器 在这个 ...