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 ...
随机推荐
- yum安装报错有冲突file /usr/lib64/php/modules/fileinfo.so conflicts between
yum安装报错有冲突file /usr/lib64/php/modules/fileinfo.so conflicts between attempted installs of php-pecl-f ...
- 启动 mysql 失败 Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql'
Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql' 这应该是某种情况下导致/usr/ ...
- 关于PHP Websocket 错误: "stream_select(): You MUST recompile PHP with a larger value of FD_SETSIZE" 的解决方案
最近在使用Ratchet (一个PHP websocket框架)改造一个PHP网站的时候,出现了错误: "It is set to 1024, but you have descriptor ...
- iis 下的 selfssl
当然,如果你想省掉所有这些麻烦也行,最简单的在IIS启动SSL的方法只要3步: 1. 下载 IIS 6.0 Resource Kit Tools: http://www.microsoft.com/d ...
- 植物大战僵尸中文第二版和年度版 游戏分析及delphi源码
00413184 |. E8 77E30100 |CALL PlantsVs.00431500 ; 地上的物品00413189 |. 8D7424 10 ...
- Jquery 在动态元素上绑定事件
弄了很久却没有弄出来,感觉没有错,但是动态元素上的事件根本就不响应,代码如下: <input type="button" id="btnyes" valu ...
- Android中关于日期时间与时区的使用总结
在开发Android的过程中,出现过几次由于日期时间导致的问题,而且主要是由于时区的原因导致,所以一直想总结一下,形成一个良好的开发规范. 一.Unix时间戳 Unix时间戳(Unix tim ...
- ubuntu 12.04版本出现界面终端打开broken pipe,但是tty1这些可以。
sudo apt-get remove xserver-xorg sudo apt-get install xserver-xorg
- 【Ibatis】总结各种使用技巧
[Ibatis]总结各种使用技巧 <alias> <typeAlias alias="YintaiMobile_FreeData_Model" type=&quo ...
- 【开发记录】iOS中使用 Reachability 检测网络
如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder),或者在没有网络状态下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测. 写本文的目的 了解Re ...