Test Header HTML Code

笔试题-自然数因数分解最小和

 

好像是一次笔试题,以下是我当时的回答,也不知道考官是怎么看的,应该有更好的解决办法。

题目:给定自然数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; //素数,返回本身
}

欢迎大家给出更好的建议,谢谢!

posted on 2010-04-02 12:26  宁静的水泡  阅读(1170)  评论(2编辑  收藏  举报

导航

Test Rooter HTML Code