没有阵列的重复功能1 22 333 4444 55555

时间:2016-11-19 18:38:12

标签: c++ algorithm

F是一个函数,数字x以升序f(x)重复。

  

x:1 2 3 4 5 6 7 8 9 10

     

f(x):1 2 2 3 3 3 4 4 4 4

我的函数获取'x'并给出'f(x)'并且它必须在没有数组的情况下执行它,但它在大数字中出错。

int main()
{
int n;
cin>>n;
int i=1,a=1;
if(n==1)
cout<<'1';
else{
    while(true){
    a++;
    i=i+a;
    if(i>=n)
        break;
}
}
cout<<a;
return 0;

}

2 个答案:

答案 0 :(得分:3)

<强> TL; DR

f(x) = floor(0.5 + sqrt(1 + 8 * (x - 1)) / 2)

<强>解释

好吧,因为这是一个数学问题,只需用数学解决;)

需要注意的一点是表与triangular numbers

之间的关联
h(x) = sum(range(1, x)) = x*(x + 1)/2 //triangular number

x        1   2   3   4   5   6   7   8   9   10

f(x)     1   2   2   3   3   3   4   4   4   4

h(f(x))  1   3   3   6   6   6   10  10  10  10

那么这对我们有什么帮助?好吧,我们可以写一个新的等式:

h(f(x)) = x | x = max({n | f(n) = f(x)})

从逻辑上讲,以下内容适用:

h^-1(x) = f(x)

不,我们有两个选择:

称它为一天,然后通过蛮力解决其余问题:

i = 1
sum = 0

while sum < x:
    sum += i
    i++

return i - 1

或构建我们的函数h^-1(x)

h(x) = y = (x+1)x/2
h^-1(y) = x with h(x) = y

x ^ 2 + x - 2y = 0

使用quadratic formula求解x:

x = 0.5 +/- sqrt(1 + 8y) / 2

现在这个公式仍然缺少一些东西:

  • 我们得到两个结果,其中一个是否定的。我们可以抛弃负面结果,因此+/-会变成+
  • 此公式为0。说实话,我还在试图找出原因。解决方案:只需将y减1即可获得正确的结果
  • 虽然此公式返回匹配数字的正确结果,即y = 3 -> x = 3,但它返回其他输入的浮点数,因此我们必须适当地向下舍入

把它放在一起:

f(x) = floor(0.5 + sqrt(1 + 8 * (x - 1)) / 2)

答案 1 :(得分:1)

int f(int x) {
    return (x * (x + 1)) / 2;
}

int main() {
    int n;
    cin >> n;
    int left = 1, right = n;
    while(left < right) {
        int mid = left + (right - left) / 2;
        int val = f(mid);
        if(val >= n) {
            right = mid;
        }
        else {
            left = mid + 1;
        }
    }
    cout << left;

    return 0;
}

使用二进制搜索。现在我在移动。如果需要,我稍后会添加解释。如果你不了解任何事情,请告诉我。