project euler 47

本文探讨了数学问题中寻找连续四个整数每个都恰好拥有四个不同质因数的第一组数。通过编程实现了一个解决方案,利用质因数分解的方法来判断符合条件的序列。

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 = 2 2 × 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 = 2 2 × 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();
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值