#include <stdio.h>
long equation(long x){
return x*x+x;
}
long BinarySearch(long arr[],long start,long end,long k){
if(start==0 && end==0){
return 0;
}
else if((end-start)<=5){
for(int i=start;i<=end;i++){
if(arr[i]<=k && arr[i+1]>k){
return i;
}
}
}
else{
long mid=(start+end)/2;
if(arr[mid]==k){
return mid;
}
else if(arr[mid]>k){
return BinarySearch(arr,start,mid-1,k);
}
else{
return BinarySearch(arr,mid+1,end,k);
}
}
}
int main() {
long a;
scanf("%ld",&a);
long roots[a];
for(long i=0;i<a;i++){
roots[i]=equation(i);
}
printf("%ld",BinarySearch(roots,0,a-1,a));
return 0;
}
对于较小的数字(小于100000000),此代码有效,但超过100000000,此代码具有运行时错误。我将每个变量都设置为一个长整数。我使用了c ++导师,它说长方程的步骤有问题。大小8的写入无效...为什么?
答案 0 :(得分:0)
长根[a];
它是 variable length array 。这不是C ++标准的一部分。 (但是GNU编译器确实支持它。它是C99和C11- 可选的一部分)。不知道它是如何实现的。但是无论如何,它都不能包含那么多长整数。
让我们做一个数学问题。假设1MB = 10**6 Bytes
的long int大小为4字节,则100000000
long占用400MB内存。我认为它不能存储在通常为4MB的堆栈中。
您说您已经使用了long int 。但是在大多数编译器中,int
和long
之间没有区别(尽管可能与这个问题无关)。
足够大的数据范围使您多次调用递归函数,这可能导致 stack overflow 。