Project Euler 87 :Prime power triples 素数幂三元组
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 素数幂三元组的更多相关文章
- 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 ...
- project euler 16:Power digit sum
>>> sum([int(i) for i in str(2**1000)]) 1366 >>>
- Project Euler 51: Prime digit replacements
通过替换*3这样一个两位数的第一位,我们可以发现形成的九个数字有六个是质数,即13, 23,43,53,73,83.类似的,如果我们用同样的数字替换56**3这样一个五位数的第三位和第四位,会生成56 ...
- Project Euler 60: Prime pair sets
素数3, 7, 109, 673很有意思,从中任取两个素数以任意顺序拼接起来形成的仍然是素数.例如,取出7和109,7109和1097都是素数.这四个素数的和是792,是具有这样性质的四个素数的最小的 ...
- Python练习题 037:Project Euler 009:毕达哥拉斯三元组之乘积
本题来自 Project Euler 第9题:https://projecteuler.net/problem=9 # Project Euler: Problem 9: Special Pythag ...
- Python练习题 044:Project Euler 016:乘方结果各个数值之和
本题来自 Project Euler 第16题:https://projecteuler.net/problem=16 ''' Project Euler 16: Power digit sum 2* ...
- Python练习题 039:Project Euler 011:网格中4个数字的最大乘积
本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...
- Python练习题 035:Project Euler 007:第10001个素数
本题来自 Project Euler 第7题:https://projecteuler.net/problem=7 # Project Euler: Problem 7: 10001st prime ...
- Python练习题 031:Project Euler 003:最大质因数
本题来自 Project Euler 第3题:https://projecteuler.net/problem=3 # Project Euler: Problem 3: Largest prime ...
随机推荐
- [大牛翻译系列]Hadoop(19)MapReduce 文件处理:基于压缩的高效存储(二)
5.2 基于压缩的高效存储(续) (仅包括技术27) 技术27 在MapReduce,Hive和Pig中使用可分块的LZOP 如果一个文本文件即使经过压缩后仍然比HDFS的块的大小要大,就需要考虑选择 ...
- JQuery 获取json数据$.getJSON方法的实例代码
这篇文章介绍了JQuery 获取json数据$.getJSON方法的实例代码,有需要的朋友可以参考一下 前台: function SelectProject() { var a = new Array ...
- 如何计算IP地址及CIDR(收藏)
如何计算IP地址及CIDR 一. IP地址概念 IP地址是一个32位的二进制数,它由网络ID和主机ID两部份组成,用来在网络中唯一的标识的一台计算机.网络ID用来标识计算机所处的网段:主 机ID用来标 ...
- WPF 气泡尖角在左边、下面、右边、上面
由于项目需要,在弄一个气泡提示框,根据网上资料,使用Path可以将气泡画出来,下面是我画出来的. 1.气泡尖角在左边的: <Path Stroke="Black" Strok ...
- 10、WPF程序集
WPF核心程序集 PresentationCore.dll:这个程序集定义了许多构成WPF GUI层基础的类型.例如包含WPF Ink API(pc笔针输入,手写输入)的支持.几个动画基元以及几个图形 ...
- adbd cannot run as root in production builds
首先必须保证手机已经root过,可以通过以下验证: $ adb shell root@dior:/ $ su root@dior:/ # 1 2 3 执行命令后,$ 变为 # 即 root 成功 但是 ...
- Laravel5 路由问题 /home页面无法访问
参考网址:http://stackoverflow.com/questions/11791375/laravel-routes-not-working Laravel5 路由问题 /home页面无法访 ...
- Week1 Team Homework #1: Study the projects done by previous student groups
我们研究了学长的项目:百度3D地图API的调用.下面是我们对该项目的一些看法: 优点: 界面清晰 各类之间调用及其他关系容易理清. 缺点: 前段html代码过于冗杂,很多(div)块间的层次关系不 ...
- ios显示艺术字字体颜色渐变
UIColor * myColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"123.jpg"]]; self. ...
- java集合类(三)About Iterator & Vector(Stack)
接上篇:java集合类学习(二) Talk about “Iterator”: 任何容器类,在插入元素后,还需要取回元素,因为这是容器的最基本工作.对于一般的容器,插入有add()相关方法(List, ...