在一个 codechef 问题中Maximise Function
我的问题代码是:
#include<iostream>
#include<math.h>
using namespace std;
void swap(long long int *x, long long int *y)
{
long long int temp = *x;
*x = *y;
*y = temp;
}
void BubbleSort(long long int n, long long int a[])
{
// long long int i, j;
for(long long int i=0; i<n-1; i++)
{
for(long long int j=0; j<n-i-1; j++)
{
if(a[j]>a[j+1])
{
swap(a[j], a[j+1]);
}
}
}
}
int main()
{
long long int k;
cin>>k;
while(k--)
{
long long int n;
long long int a[n];
cin>>n;
for(long long int i=0; i<n; i++)
{
cin>>a[i];
}
BubbleSort(n ,a);
cout<<2*abs((a[n-1]-a[0]))<<"\n";
}
return 0;
}
当使用 int 作为下面所有变量的数据类型时,代码在 CodeChef IDE 中运行良好,但是当数据类型更改为 long long int(由于给定的约束)时,CodeChef IDE 是给出运行时错误。我无法理解正在发生的问题。请帮我找出那个问题。
运行时错误:SIGEMT
答案 0 :(得分:2)
long long int n;
long long int a[n];
cin>>n;
您正在尝试创建大小为 n
的可变长度数组,其中 n
未初始化。因此 a
的大小将是一些垃圾值,对于您最终放入其中的输入来说可能太小,或者太大以至于它立即溢出堆栈。两者都不好。当您使用 int
时,这碰巧没有崩溃,真是太幸运了。
至少,将 long long int a[n];
移到 cin>>n;
之后。
但是variable length arrays are not standard C++。考虑将其重写为使用 std::vector
,或者使用 new[]
动态分配您的数组。然后添加一些错误检查,以防无法从输入中读取整数。
此外,您的 swap(a[j], a[j+1]);
不是调用您的交换函数(它需要指针,而您正在传递 long long int
s),而是 std::swap
。这可能是一件好事,因为 std::swap
实际上在这里工作并且通常会更有效率,所以你最好放弃你的。这是downside of using namespace std;
,因为类似的事情可能会在您不注意的情况下发生。