C++ 无限运行时间

C++ 无限运行时间,c++,C++,有关Ubuntu 16.04中的以下代码 用于定制测试用例 4.3 1237 我的运行时是无限的,没有输出。(无输出表示控制台上也未打印“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) {

有关Ubuntu 16.04中的以下代码

用于定制测试用例

4.3

1237

我的运行时是无限的,没有输出。(无输出表示控制台上也未打印“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;
}
#包括
使用名称空间std;
INTA[1000000];
intfoo(intx,intf,intl)
{
int m=(f+l)/2;
而(f>n;
cin>>x;
int i=0;
对于(i=0;i>a[i];
}

cout无限循环的原因是您的
f
l
值最多更新一次。最初
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
(除非数组只有一个元素或它有两个元素,并且
x是您没有得到任何输出的原因(甚至是
'a'
)是指标准输出被缓冲。通常它是行缓冲的,这意味着只有在写入新行时才会打印它

通过执行
std::cout,可以强制立即打印缓冲区中的任何内容
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; m = f; 
            }
        else if(a[m]>x)  
            {
               l = m-1; m = l;
            }
    }
    return 0;
}