-3

基本的に、「x」個の数値の配列があり、配列の数値で符号が何回変化したかを出力する必要があります。

たとえば、配列は次のとおりです。2 -4 5 6 7 -2 5 -7

出力は 5 になるはずです。なぜですか? 1 回目は -4、2 回目は 5、3 回目は -2、4 回目は 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]してから、計算ループで(j =1 および) から(j=n および)a[n-1]を読み取ります。a[0]a[j-1]a[n]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

2 番目の for ループでは、j を <= に移動させないでください。それはただあるべきです

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

2 番目のループは で終了する必要がありますj < n

于 2013-02-04T22:07:55.963 に答える