pat乙级简单题,有部分测试点未通过

感觉写的没问题,不知道问题出在哪,希望有人帮我找一下,写的有点乱,如果能给我把结构再整理一下就更好了,感谢!

img

img


#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

int main() {
    vector<int> civec;
    int temp, N;
    vector<int> oivec(5);
    cin >> N;
    for (auto i = 0; i != N; ++i) {
        cin >> temp;
        civec.push_back(temp);
    }
    int count = 1, count3 = 0;
    for (auto i : civec) {
        if (i % 5 == 0) {
            if (i % 2 == 0) {
                oivec[0] += i;
            }
        }
        if (i % 5 == 1) {
            oivec[1] += count*i;
            count *= -1;
        }
        if (i % 5 == 2) {
            ++oivec[2];
        }
        if (i % 5 == 3) {
            oivec[3] += i;
            ++count3;
        }
        if (i % 5 == 4) {
            if (i > oivec[4]) {
                oivec[4] = i;
            }
        }
    }
    double oi3 = oivec[3] / (count3*1.0);
    for (auto i = 0; i != 5; ++i) {
        if (i == 3) {
            if (!oi3) {
                cout << "N" << " ";
            }
            else {
                cout << setiosflags(ios::fixed) << setprecision(1) << oi3 << " ";
            }
        }
        else {
            if (oivec[i] != 0) {
                cout << oivec[i];
            }
            else {
                cout << "N";
            }
            if (i != 4) {
                cout << " ";
            }
        }
    }
}

你的主要问题:
1)计算oi3,已经除数为0,溢出了,后面就有异常了
2)有些数值0,是正确的统计结果,最好用-1表示最初的最大值,后面容易判断

if (oivec[i] != 0) {
    cout << oivec[i];
}
else {
    cout << "N";
}
if (i != 4) { // 这个要提前判断
    cout << " ";
}

其它改动的建议见代码:

#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

int main()
{
    vector<int> v;

    // 我的测试用例
    // v.insert(v.begin(), {30, 5, 17, 14, 23, 20, 21, 16, 27, 13, 44, 31});

    int N;
    cin >> N;
    for (auto i = 0; i != N; ++i)
    {
        int temp;
        cin >> temp;
        v.push_back(temp);
    }

    int a1 = 0; // 被5整除的偶数之和

    int count_a2 = 0; // 便于交错求和
    int a2 = 0; // 余1情况,交错求和

    int a3 = 0; // 余2,统计个数

    int count_a4 = 0;
    int a4 = 0; // 余3,先求和,用于后面求平均数

    int a5 = -1; // 余4,找最大的数

    for (auto temp : v)
    {
        switch(temp % 5)
        {
        case 0:
            if (temp % 2 == 0)
            {
                a1 += temp;
            }
            break;
        case 1:
            a2 += (count_a2 % 2 == 0 ? 1 : -1 ) * temp;
            ++count_a2;
            break;
        case 2:
            ++a3;
            break;
        case 3:
            a4 += temp;
            ++count_a4;
            break;
        case 4:
            if (temp > a5)
            {
                a5 = temp;
            }
            break;
        }
    }

    cout << a1 << ' ' << a2 << ' ' << a3 << ' ';

    if(count_a4 == 0)
    {
        cout << 'N' << ' ';
    }
    else
    {
        cout << setiosflags(ios::fixed) << setprecision(1) << a4 * 1.0 / count_a4 << ' ';
    }

    if(a5 == -1)
        cout << 'N';
    else
        cout << a5;
}

仅供参考

#include <iostream>
#include <cmath>
using namespace std;
 
int main(){
    int N,s1=0,s2=0,tmp,cnt1=0,cnt2=0,cnt3=0,max=0,f1=0,f2=0,f3=0,f4=0,f5=0;    cin>>N;
    double s3=0.0;
    do{
        cin>>tmp;
        if(tmp%5==0&&tmp%2==0){
            s1+=tmp;    f1=1;
        }    
        if(tmp%5==1){
            cnt1++;    s2+=tmp*pow(-1,cnt1-1);    f2=1;
        }
        if(tmp%5==2){
            f3=1;    cnt2++;
        }    
        if(tmp%5==3){
            cnt3++;    s3+=tmp;    f4=1;
        }
        if(tmp%5==4&&max<tmp){
            f5=1;    max=tmp;
        }    
    }while(getchar()!='\n');
    if(f1==1)    cout<<s1;
    if(f1==0)    cout<<"N";
        if(f2==1)    cout<<" "<<s2;
        if(f2==0)    cout<<" N";
            if(f3==1)    cout<<" "<<cnt2;
            if(f3==0)    cout<<" N";
                if(f4==1)    printf(" %.1lf",s3/cnt3);
                if(f4==0)    cout<<" N";
                    if(f5==1)    cout<<" "<<max;
                    if(f5==0)    cout<<" N";
    return 0;
}