无限的运行时间

时间:2018-09-04 01:22:25

标签: c++

对于Ubuntu 16.04中的以下代码

对于自定义测试用例

4 3

1 2 3 7

我的运行时是无限的,没有输出。 (无输出表示“ a”也未打印在控制台上)。但是,当我注释函数调用foo

// int temp = foo(ab, 0, n-1);

我得到输出

a ##

运行时间无限并且我没有任何输出的原因是什么?

#include<bits/stdc++.h>

using namespace std;

int a[1000000];

int foo(int x, int f, int l)
{
    int m = (f+l)/2;
    while(f<=l)
    {
        if(a[m]==x)
            return 1;
        else if(a[m]<x)
            f = m+1;
        else if(a[m]>x)
            l = m-1;
    }
    return 0;
}

int main()
{
    int n, x;
    cin >> n;
    cin >> x;
    int i=0;
    for (i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    cout<<'a';
    sort(a,a+n);
    for(i=0; i<n-1; i++)
    {
        if(a[i]==a[i+1])
        {
            cout << 0;
            return 0;
        }
    }
    cout<<'#';

    int ab = a[i];
    int temp = foo(ab, 0, n-1);
    cout<<'#';
    return 0;
}

2 个答案:

答案 0 :(得分:0)

无限循环的原因是您的fl值最多更新一次。最初m指向数组的中间位置(即(n-1)/2),从那一刻起,
-如果元素a[m]小于x,则可以将m+1(n-1)/2 + 1无限分配给f
-如果元素a[m]大于x,则将(n-1)/2 - 1无限分配给l

在任何一种情况下,f都不会大于l,而l永远不会小于f(除非数组只有一个元素,或者有两个元素,而{ {1}})

尝试通过以下方式更新功能:

x<a[0]

答案 1 :(得分:0)

没有得到任何输出(甚至没有'a')的原因是stdout被缓冲了。通常,它是行缓冲的,这意味着只有在写新行时才打印。

您可以通过执行std::cout << std::flush;来强制将缓冲区中的所有内容立即打印出来,例如,在您的情况下,std::cout << 'a' << std::flush;可以工作。