Problem 47
Distinct primes factors
The first two consecutive numbers to have two distinct prime factors are:
15 = 3 × 5
The first three consecutive numbers to have three distinct prime factors are:
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?
不同的质因数
首次出现连续两个数均有两个不同的质因数是在:
15 = 3 × 5
首次出现连续三个数均有三个不同的质因数是在:
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();
}