project euler 50
2015-12-04 21:35
316 查看
Problem
50
Consecutive prime sumThe prime 41, can be written as the sum of six consecutive primes:
41 = 2 + 3 + 5 + 7 + 11 + 13
This is the longest sum of consecutive primes that adds to a prime below one-hundred.
The longest sum of consecutive primes below one-thousand that adds to a prime, contains 21 terms, and is equal to 953.
Which prime, below one-million, can be written as the sum of the most consecutive primes?
连续素数的和
素数41可以写成六个连续素数的和:
41 = 2 + 3 + 5 + 7 + 11 + 13
在小于一百的素数中,41能够被写成最多的连续素数的和。
在小于一千的素数中,953能够被写成最多的连续素数的和,共包含连续21个素数。
在小于一百万的素数中,哪个素数能够被写成最多的连续素数的和?
public static final SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); @Test public void testCase() { getLongest(1000000); } void getLongest(int upLimit) { List<Integer> primeList = new ArrayList<Integer>(); for (int i = 2; i <= upLimit; i++) { if (isPrime((long) i)) { primeList.add(i); } } int start = 0; int end = 0; int count = 0; Long sum = 0L; Long allSum = 0L; for (int i = 0; i < primeList.size(); i++) { allSum += primeList.get(i); } allSum += primeList.get(0); for (int i = 0; i < primeList.size(); i++) { if (i == 0) { allSum -= primeList.get(0); } else { allSum -= primeList.get(i - 1); } sum = allSum; int j = primeList.size() - 1; while (sum >= upLimit) { sum -= primeList.get(j--); } for (; j > i; j--) { if (isPrime(sum)) { assert (sum < upLimit); if (count < j - i + 1) { start = i; count = j - i + 1; end = j; } break; } else { // if( sum % 2 == 0){ // if( j > i){ // sum -= primeList.get(j); // } // j = j - 1; // } // // if( j > i){ // sum -= primeList.get(j); // } // j = j - 1; // if( j > i){ // sum -= primeList.get(j); // } // j = j - 1; sum -= primeList.get(j); if (count > j - i + 1) { break; } } } } sum = 0L; for (int i = start; i <= end; i++) { System.out.print(primeList.get(i) + ","); sum += primeList.get(i); } System.out.println(); System.out.println("sum=" + sum + ", count=" + count + "," + isPrime(sum)); } public static boolean isPrime(Long num) { long val = Math.abs(num); if (val <= 10) { if (val == 2 || val == 3 || val == 5 || val == 7) { return true; } return false; } for (int i = 2; i * i <= val; i++) { if (val % i == 0) { return false; } } return true; }
相关文章推荐
- jQuery-1.9.1源码分析系列(十六)ajax——ajax处理流程以及核心函数
- PAT 1006 换个格式输出整数
- leetcode Find the Duplicate Number
- project euler 49
- C++调用CMD,等CMD运行完后继续运行C++
- C语言 scanf 函数返回值问题探究
- 找出下图的互联网产品实例
- STM32F407的定时器1之7路PWM输出
- 数组和指针
- Struts2学习——(五)ModelDriven使用方法及机制学习
- 安装Ubuntu双系统系列——安装Ubuntu
- JSON
- java 非法字符: \65279
- 穹顶之下,优越之上
- 算法目录
- project euler 48
- 《实时控制软件设计》第二个编程作业
- ubuntu安装数据库postgresql
- 云锁多机版云中心使用测评
- android的MVP模式以及接口的理解