对于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;
}
答案 0 :(得分:0)
无限循环的原因是您的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
(除非数组只有一个元素,或者有两个元素,而{ {1}})
尝试通过以下方式更新功能:
x<a[0]
答案 1 :(得分:0)
没有得到任何输出(甚至没有'a'
)的原因是stdout
被缓冲了。通常,它是行缓冲的,这意味着只有在写新行时才打印。
您可以通过执行std::cout << std::flush;
来强制将缓冲区中的所有内容立即打印出来,例如,在您的情况下,std::cout << 'a' << std::flush;
可以工作。