Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17407
  • 博文数量: 22
  • 博客积分: 920
  • 博客等级: 准尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-27 15:19
文章分类

全部博文(22)

文章存档

2010年(22)

我的朋友
最近访客

分类:

2010-03-27 16:24:05

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

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

}


阅读(686) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~