project euler 47
2015-12-04 21:31
471 查看
Problem
47
Distinct primes factorsThe first two consecutive numbers to have two distinct prime factors are:
14 = 2 × 7
15 = 3 × 5
The first three consecutive numbers to have three distinct prime factors are:
644 = 22 × 7 × 23
645 = 3 × 5 × 43
646 = 2 × 17 × 19
Find the first four consecutive integers to have four distinct prime factors. What is the first of these numbers?
不同的质因数
首次出现连续两个数均有两个不同的质因数是在:
14 = 2 × 7
15 = 3 × 5
首次出现连续三个数均有三个不同的质因数是在:
644 = 22 × 7 × 23
645 = 3 × 5 × 43
646 = 2 × 17 × 19
首次出现连续四个数均有四个不同的质因数时,其中的第一个数是多少?
@Test public void test() { System.out.println(getFirst()); } int getFirst() { int start = 2 * 3 * 5 * 7; IntegerDivisor div = new IntegerDivisor(); // start = 1 , 2, 3, 4 while (true) { div.divisor(start); if (div.primeMap.entrySet().size() == 4) { div.clear(); div.divisor(start + 3); if (div.primeMap.entrySet().size() != 4) { div.clear(); start += 4; continue; } else { // ok == 4 div.clear(); div.divisor(start + 2); if (div.primeMap.entrySet().size() != 4) { div.clear(); start += 3; continue; } else {// ok = 4, 3 div.clear(); div.divisor(start + 1); if (div.primeMap.entrySet().size() != 4) { div.clear(); start += 2; continue; } else {// ok == 4, 3, 2 div.clear(); div.divisor(start + 1); if (div.primeMap.entrySet().size() != 4) { div.clear(); start += 1; continue; } else { return start; } } } } } else { start += 1; div.clear(); continue; } } } /** * 因子分解 * * @author 1440 * */ public static class IntegerDivisor { public Map<Long, Integer> primeMap = new HashMap<Long, Integer>(); public List<Long> primeList = new ArrayList<Long>(); public void clear() { primeMap.clear(); primeList.clear(); } public void divisor(long num) { if (num <= 1) return; long prime = getPrime( num, primeList.size() == 0 ? 2 : primeList.get(primeList.size() - 1)); if (prime < 0) { primeMap.put(num, 1); primeList.add(num); return; } else { primeList.add(prime); int count = 0; do { count += 1; num = num / prime; } while (num % prime == 0); primeMap.put(prime, count); divisor(num); } } private long getPrime(long num, long start) { for (long i = start; i <= Math.sqrt(num); i++) { if (num % i == 0) { return i; } } return -1; } @Override public String toString() { return print_Map(this.primeMap); } public Long getLargestPrime() { return primeList.get(primeList.size() - 1); } } public static String print_Map(Map<?, ?> primeMap) { StringBuilder sb = new StringBuilder(); for (Entry<?, ?> entry : primeMap.entrySet()) { sb.append(entry.getKey().toString() + "=" + entry.getValue().toString() + "\n"); } return sb.toString(); }
相关文章推荐
- matlab图像滤波
- 王道程序员求职宝典阅读笔记20151204
- OC 类别(分类)Categroy
- for语句练习 阶乘
- 数学上的一些算法
- light--oj--1294-- Positive Negative Sign(数学规律)
- OC控件间的继承关系,用UI实现
- leetcode Word Pattern
- 计蒜课—和为M的组合个数
- Openfire on Centos7
- CSS3之position
- poj--1637--Sightseeing tour(网络流,最大流判断混合图是否存在欧拉图)
- 按键精灵V1.0版
- 【练习手记】【多题合集】用树状数组做线段树练习1、2、3
- 开源界何时不再玩捉迷藏游戏?
- project euler 46
- poj--1637--Sightseeing tour(网络流,最大流判断混合图是否存在欧拉图)
- Ubuntu更新数据源
- 解决This function or variable may be unsafe的方法
- qt+opencv3.0配置详解