C++ 无限运行时间
有关Ubuntu 16.04中的以下代码 用于定制测试用例 4.3 1237 我的运行时是无限的,没有输出。(无输出表示控制台上也未打印“a”)。但是,当我注释函数调用foo时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) {
// 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;
}