-3

基本上,我有一个给定“x”数字的数组,我必须输出数组数字中符号变化的次数。

例如数组是:2 -4 5 6 7 -2 5 -7

输出应该是 5。为什么?因为符号第一次在-4,第二次在5,第三次在-2,第四次在5,最后一次在-7。共5次。

所以,到目前为止我有这个,但这并不完美:

#include <iostream>
using namespace std;

int main()
{
int a[50],n,cs=0,ha=0;



cin >> n;
for (int i=0;i<n;i++)
{
    cin >> a[i];
}
for (int j=1;j<=n;j++)
{
    if(a[j]<0 && a[j-1]>0)
    cs++;
    else if(a[j]>0 && a[j-1]<0)
    cs++;
}
cout << cs << endl;
return 0;
}

请帮忙!

4

4 回答 4

3

您的问题是您遇到了未初始化的内存,这导致了未定义的行为。a[0]您在输入循环中初始化a[n-1],然后在计算循环中从a[0](with j=1 and a[j-1]) 读取到a[n](j=n and a[j])。

只需将其更改为j < n.

于 2013-02-04T22:07:08.783 回答
2

如果您可以选择 STL,则可以使用std::adjacent_find. 这是您在完整程序中使用它的方式:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<int> v { 1 , 3, -5, 8, -9, -10, 4 };

    auto signSwitch = [] (int x, int y) { return (abs(x) == x) ^ (abs(y) == y); };

    int cnt = 0;
    auto i = adjacent_find(begin(v), end(v), signSwitch);
    while (i != end(v))
    {
        cnt++;
        i = adjacent_find(i + 1, end(v), signSwitch);
    }

    cout << cnt;
}
于 2013-02-04T22:08:33.047 回答
1

您的第二个循环应该终止于j < n.

于 2013-02-04T22:07:55.963 回答
1

在你的第二个 for 循环中,你不应该让 j 转到 <=。它应该只是

 for (int j=1;j<n;j++)
于 2013-02-04T22:11:59.990 回答