在以下代码中,当我删除cout语句(// ******之后的行)时,这会导致“ i”的值发生变化。 我使用了TDM-GCC 4.9.2 32位版本和TDM-GCC 5.1.0编译器。 我在codechef上运行了这段代码,并且在这里运行良好,并且cout语句不影响“ i”的值。
#include<iostream>
using namespace std;
int subset(int [], int);
int main()
{
int size,i,ans;
cout<<"size of array : ";
cin>>size;
int arr[size];
for(i = 0 ; i<size;i++)
{
cin>>arr[i];
}
ans = subset(arr,size);
cout<<"ans = "<<ans;
return 0;
}
int subset(int arr[], int size)
{
int i,j, tsum=0, completed=0;
for(i = 0 ;i<size;i++)
tsum = tsum + arr[i];
int carr[tsum+1],temp;
for(i=0;i<size;i++)
{
temp = arr[i];
carr[temp] = 1;
for(j=i+1;j<size;j++)
{
temp = temp + arr[j];
carr[temp] = 1;
}
}
for(i=1;i<=tsum;i++)
{
if(carr[i]!=1)
{
//************************************
cout<<"i : "<<i<<endl;
break;
}
}
return i;
}
样本输入: 数组大小:3
1 2 5
不带cout语句的示例输出:
ans = 6
具有cout语句的示例输出:
i:4
ans = 4
输入的实际答案为4。
答案 0 :(得分:0)
主要问题似乎是carr
尚未初始化。
它声明为
int carr[tsum+1]
没有初始化程序。
后来设置了某些元素,但始终设置为1
:
carr[temp] = 1;
在最后一个循环carr
中进行检查:
if(carr[i]!=1)
这种情况没有道理。要么设置carr[i]
,然后保证它是1
,要么未初始化,在这种情况下,此比较具有不确定的行为。
请注意,可变长度数组不是标准的C ++。
答案 1 :(得分:0)
要解决 Some Programmer Dude 和 melpomene 所述的问题,即可变长度数组不是标准C ++,并且carr
未初始化。使用c ++向量并正确初始化它们。看起来像这样:
#include <iostream>
#include <vector>
using namespace std;
int subset(const std::vector<int>, const int);
int main()
{
int size, i, ans;
cout << "size of array : ";
cin >> size;
std::vector<int> arr(size);
for (i = 0; i < size; i++)
{
cin >> arr[i];
}
ans = subset(arr, size);
cout << "ans = " << ans;
return 0;
}
int subset(const std::vector<int> arr, const int size)
{
int i, j, tsum = 0, completed = 0;
for (i = 0; i < size; i++)
tsum = tsum + arr[i];
std::vector<int> carr(tsum + 1, 0);
int temp;
for (i = 0; i < size; i++)
{
temp = arr[i];
carr[temp] = 1;
for (j = i + 1; j < size; j++)
{
temp = temp + arr[j];
carr[temp] = 1;
}
}
for (i = 1; i <= tsum; i++)
{
if (carr[i] != 1)
{
//************************************
cout << "i : " << i << endl;
break;
}
}
return i;
}