笔试题-自然数因数分解最小和
好像是一次笔试题,以下是我当时的回答,也不知道考官是怎么看的,应该有更好的解决办法。
题目:给定自然数N,若N为1或者素数,则和为N。否则分解N为若干自然数的和,求最小的和。
思想:首先要解决怎样分解和才最小,对于任何大于2的自然数a, b, 则1/a + 1/b < 1/2 + 1/2 = 1. 所以a + b < ab。所以对于N的任何一个因子m, 若m=ab,由于m>a+b,所以应该将m分解成a和b。所以和最小的情况是将N分解成所有的素数乘积。
int minSum(int n)
{
if(1 == n || 2 == n) return n;
for(int i = 2; i <= n/2; i++) //n若有因子肯定小于等于n/2
{
if(n % i == 0) //i为n的一个因子
{
if(minSum(i) == i) //若最小和等于本身则表示i为素数
{
return i + minSum(n / i); //动态规划求值
}
}
}
return n; //素数,返回本身
}
欢迎大家给出更好的建议,谢谢!