project euler 3

Problem 3


Largest prime factor

The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?


最大质因数

13195的所有质因数为5、7、13和29。

600851475143最大的质因数是多少?

package projecteuler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.junit.Test;

public class Prj3 {

	@Test
	public void test() {
		{
			IntegerDivisor div = new IntegerDivisor();
			div.divisor(600851475143L);
			System.out.println(div);
		}
		{
			IntegerDivisor div = new IntegerDivisor();
			div.divisor(100001);
			System.out.println(div);
		}
		{
			IntegerDivisor div = new IntegerDivisor();
			div.divisor(10010);
			System.out.println(div);
		}
		{
			IntegerDivisor div = new IntegerDivisor();
			div.divisor(1100);
			System.out.println(div);
		}

		System.out.println(new CalculateMaxPrime(20).calculate());
	}

	public static class IntegerDivisor {

		public Map<Long, Integer> primeMap = new HashMap<Long, Integer>();
		public List<Long> primeList = new ArrayList<Long>();

		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() {

			StringBuilder sb = new StringBuilder();
			for (Entry<Long, Integer> entry : primeMap.entrySet()) {
				sb.append(entry.getKey().toString() + "="
						+ entry.getValue().toString() + "\n");
			}

			for (int i = 0; i < primeList.size(); i++) {
				sb.append(primeList.get(i) + "--->");
			}
			return sb.toString();
		}

		public Long getLargestPrime() {
			return primeList.get(primeList.size() - 1);
		}

	}

}

class CalculateMaxPrime {

	private int num;

	public CalculateMaxPrime(int num) {
		this.num = num;

	}

	public int calculate() {

		for (int i = num - 1; i >= 2; i--) {
			if (isPrime(i) && num % i == 0) {
				return i;
			}
		}

		return num;
	}

	private boolean isPrime(int val) {

		for (int i = 2; i <= Math.sqrt(val); i++) {
			if (val % i == 0) {
				return false;
			}
		}

		return true;
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值