2016-9-18 同学去滴滴面试的一道算法题

题目是这样的,对于一个自然数N,如果N为1或者素数,则和为N;否则N可以被分解为若干自然数之和,求最小的和。

我刚开始想的是回溯法,但是应该是不正确的。。。。总之我没想出来,在网上搜到了一种做法

对于任何大于2的自然数a,b:a + b > a * b。如果N = a * b,则 N > a + b。a和b如果是合数,则可以继续被分解下去。那么求N的最小因数和即求N的素质数和。

贴出一段递归的算法:

  public static int minSum(int n) {

  		if ( n < 3 )
  			return n;

  		int sum = 0;

  		for (int i = 2; i <= n / 2; i++) {

  			// 如果i是n的一个因数
  			if ( n % i == 0 ) {

  				if ( isPrime(i) )
  					return i + minSum(n / i);
  			}
  		}

  		return n;
  	}
Written on September 18, 2016