您的位置:首页 > 其它

project euler 47

2015-12-04 21:31 471 查看


Problem
47

Distinct primes factors

The 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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: