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. 转:关于Apache与Nginx的优势比较(经典)

    不断有人跟我说Nginx比Apache好.比Apache快之类.Nginx更主要是作为反向代理,而非Web服务器使用.我翻译过一本关于反向代理的技术书籍,同时精通Apache API开发,对Nginx ...

  2. C#多线程与UI响应 跨线程更新UI

    最近在写一个TCP通信程序,自定义了一个通信类TCPclient,用于客户端异步接收和发送网络消息. TCPclient中定义了一个接收到新的网络消息事件: //收到新消息事件 public dele ...

  3. MongoDB五种树形结构表示法

    MongoDB五种树形结构表示法 第一种:父链接结构 db.categories.insert( { _id: "MongoDB", parent: "Databases ...

  4. 正则PerlRegEx实现的批量替换指定文件中的标签

    示例: 一个朋友需要而编写的标签升级更新. 速度超快,1w个文件大概4,5秒,本想加个多线程显示进度,后来想想算了 主要代码: reg.RegEx := '<' + Edit_regular1. ...

  5. Hadoop2

    http://www.cnblogs.com/miaoxiaoyu/archive/2012/07/29/2614060.html

  6. Win8 硬盘100%几个修复方法

    上连接 1.改注册表:http://jingyan.baidu.com/article/e3c78d647f79be3c4c85f5d0.html 2.待续

  7. .net如何调试dll

    引用"谢绝关注的BLOG" http://blog.sina.com.cn/s/blog_50cc0ffd0100cqhp.html 在同一个解决方案中一定要将调用DLL文件的工程 ...

  8. Asp.Net生命周期系列五

    如果您看了我的前四篇文章,应该知道目前Http请求已经流到了HttpModule这个程序员手中了,而且我们可以注册自己的HttpModule并且可以在里面注册一些事件来控制这个Http请求,但是到目前 ...

  9. 工程移除CocoaPods依赖库

    http://zanderzhang.gitcafe.io/2015/09/26/工程移除CocoaPods依赖库/ 点这里--->CocoaPods安装和使用教程 当我们工程安装很多第三方开源 ...

  10. BZOJ 1083: [SCOI2005]繁忙的都市 裸的最小生成树

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1083 代码: #include<iostream> #include< ...