给定n,找到为n得到的最大数字

时间:2014-02-09 07:49:43

标签: c algorithm

在oracle采访中提出问题。例如,如果我的输入是6,那么

  • 5 + 1 = 6 Ans:2
  • 4 + 2 = 6 Ans:2
  • 3 + 2 + 1 = 6 Ans:3

因此,最终答案应为3.(即获得总和6需要3,2,1)

注意:不允许重复号码(即1 + 1 + 1 + 1 + 1 + 1 = 6)

我使用递归来解决它,但面试官并不满意。动态编程是否可行?

2 个答案:

答案 0 :(得分:10)

x数的最小总和是

minimum sum

所以找到满足不等式的x:

inequality formula

以下是代码:

#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    int x = 1;
    while ((x+1)*x/2 <= n) x++;
    x--; // now (x+1)*x/2 > n , so x is too large
    printf("%d\n", x);
    return 0;
}

如果n非常大,您可以使用二进制搜索。

答案 1 :(得分:4)

我准备发布答案,但@Cruise Liu打败了我。我试着解释一下。 它是一种整数分区,但你不需要生成元素,因为你只对'元素数'感兴趣。即最终答案3而不是{1,2,3}

给定数字N,您有另一个限制,数字不能重复。 因此,最好的情况是如果N实际上是一个数字,例如1,3,6,10,15

i.e. f(x) = x * (x + 1) / 2. 

例如,取6. f(x)= 6存在。特别是f(3)= 6。因此,你得到了答案3.

这意味着如果存在f(x)= N的整数X,那么有一组数字1,2,3 ...... x在加起来时给出N.这是可能的最大数量(没有重复)。

但是,有些情况在f(x)= N,其中x不是整数。

f(x) = x * (x + 1 ) / 2 = N
i.e. x**2 + x = 2*N
x**2 + x - 2*N = 0

解决这个二次方法得到

quadratic solved

由于数字x不是负数,我们不能

not possible

所以我们留下了

left with

对于N = 6

n equals 6

一个完美的整数。但是对于N = 12

n equals 12

是8.845 / 2,这是一个分数。楼层值为4,这就是答案。

简而言之:实现一项功能 f(N)=(int)((-1.0 + sqrt(1 + 8 * N))/ 2.0)

int max_partition_length(int n){
    return (int)((-1.0 + sqrt(1 + n*8))/2);
}