下面的代码是count int m可以由数组数据中的哪个数字组成,但是exit的return 0;
表达式不起作用,它会发生堆栈损坏,我必须使用exit(0);
,为什么?
#include <iostream>
#include <cstdlib>
void increase(bool seq[], int size);
constexpr int n = 5;
int main()
{
int m, data[n];
bool seq[n];
std::cin >> m;
for (int i = 0; i < n; ++i) {
std::cin >> data[i];
seq[i] = false;
}
while (true) {
bool isEnd = true;
for (int i = 0; i < n; ++i)
if (!seq[i])
isEnd = false;
if (isEnd) {
std::cout << "IMPOSSIBLE!!!";
return 0;
}
int sum = 0;
for (int i = 0; i < n; ++i)
if (seq[i])
sum += data[i];
if (sum == m) {
for (int i = 0; i < n; ++i)
if (seq[i])
std::cout << data[i] << " ";
std::cout << std::endl;
return 0;
}
increase(seq, n);
}
}
void increase(bool array[], int size)
{
bool isCarry = true;
for (int i = size; i >= 0; --i) {
if (isCarry) {
isCarry = array[i];
array[i] = !array[i];
}
}
}
这个代码不正确
void increase(bool array[], int size)
{
bool isCarry = true;
for (int i = size; i >= 0; --i) {
if (isCarry) {
isCarry = array[i];
array[i] = !array[i];
}
}
}
应该是
void increase(bool array[], int size)
{
bool isCarry = true;
for (int i = size - 1; i >= 0; --i) {
if (isCarry) {
isCarry = array[i];
array[i] = !array[i];
}
}
}
大小为N的数组的有效索引为0到N-1(包括)。
这是有争议的,但是您可以在increas
中用
for (int i = size; i --> 0; /*intentionally blank*/){
这样做的好处是,它还可以处理无符号
类型。 -->
是幻灯片运算符,当然,它根本不是真正的运算符,而是--
后跟>
。
并不是所有的软件公司都允许这样做。 我有。 也许这是因为我更多地是一个数学程序员,并且随着我的成长,我发现它是一种惯用的倒数到零的方式,特别是对于无符号
类型,我认为您的大小
和I
应该是这样的--在这种情况下,I>=0
将始终是true
。