project euler 87

来源:互联网 发布:sql编程基础 编辑:程序博客网 时间:2024/06/10 05:54

Problem 87


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

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

package projecteuler;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Set;import junit.framework.TestCase;public class Prj87 extends TestCase {public static final int LIMIT = 50000000;// public static final int LIMIT = 50;public void testPrimePowerTriples() {int v = 500000000;v = (int) Math.sqrt(1.0 * v / 3);System.out.println("v=" + v);List<Integer> primeList = new ArrayList<Integer>();for (int i = 2; i < v + 1; i++) {if (isPrime(i)) {primeList.add(i);}}Set<PowerDigital> set = new HashSet<PowerDigital>();int[] arr = new int[3];dfs(set, arr, 0, primeList);System.out.println("count=" + set.size());for (PowerDigital p : set) {System.out.println(p);}}private boolean isPrime(int val) {if (val <= 10) {if (val == 2 || val == 3 || val == 5 || val == 7) {return true;}return false;}if (val % 2 == 0) {return false;}for (int i = 3; i * i <= val; i++) {if (val % i == 0) {return false;}}return true;}void dfs(Set<PowerDigital> set, int[] arr, int start,List<Integer> primeList) {if (start >= arr.length) {return;}for (int i = 0; i < primeList.size(); i++) {int val = primeList.get(i);if (start == 0) {arr[0] = val;dfs(set, arr, start + 1, primeList);} else if (start == 1) {int sum = (int) (Math.pow(arr[0], 2) + Math.pow(val, 3));if (sum > LIMIT) {return;}arr[1] = val;dfs(set, arr, start + 1, primeList);} else if (start == 2) {int sum = (int) (Math.pow(arr[0], 2) + Math.pow(arr[1], 3) + Math.pow(val, 4));if (sum > LIMIT) {return;}arr[2] = val;set.add(new PowerDigital(arr[0], arr[1], arr[2], sum));}}}public static class PowerDigital {public int i;public int j;public int k;public int val;public PowerDigital(int i, int j, int k, int val) {super();this.i = i;this.j = j;this.k = k;this.val = val;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + val;return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;PowerDigital other = (PowerDigital) obj;if (val != other.val)return false;return true;}@Overridepublic String toString() {return "[i=" + i + ", j=" + j + ", k=" + k + ", val=" + val + "]";}}}


0 0