7-11 整数的分类处理

给定 N 个正整数,要求你从中得到下列三种计算结果:

A1 = 能被 3 整除的最大整数
A2 = 存在整数 K 使之可以表示为 3K+1 的整数的个数
A3 = 存在整数 K 使之可以表示为 3K+2 的所有整数的平均值(精确到小数点后 1 位)

输入格式:

输入首先在第一行给出一个正整数 N,随后一行给出 N 个正整数。所有数字都不超过 100,同行数字以空格分隔。

输出格式:

在一行中顺序输出 A1、A2、A3的值,其间以 1 个空格分隔。如果某个数字不存在,则对应输出NONE。

输入样例 1:

8
5 8 7 6 9 1 3 10

输出样例 1:
9 3 6.5
输入样例 2:

8
15 18 7 6 9 1 3 10

输出样例 2:
18 3 NONE

代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

版本一

AC代码如下:(别管注释)

#include 
#include 
#include 
using namespace std;

void A1(int a[],int size){
    int maxInt = 0;
    for(int i=0; i<size; i++){
        int temp = 0;
        if (a[i] % 3 == 0 && a[i] > maxInt) { // 修改此处条件!!!!
            temp = a[i];
            if(temp > maxInt){
                maxInt = temp;
            }
        }
    }
    if(maxInt>=3){
        cout<< maxInt;
    }else{
        cout<<"NONE";
    }
}

void A2(int a[],int size){
    int counts = 0;
    for (int i = 0; i < size; i++) {
        if ((a[i] - 1) % 3 == 0) { // 修改此处条件
            counts++;
        }
    }
    if(counts != 0){
        cout<< counts;
    }else{
        cout<<"NONE";
    }
}

void A3(int a[],int size){
    int sum = 0;
    int count = 0;
    for (int i = 0; i < size; i++) {
        if ((a[i] - 2) % 3 == 0) { // 修改此处条件
            sum += a[i];
            count++;
        }
    }
    if (count != 0) {
        float avg = static_cast<float>(sum) / count;
        cout << fixed << setprecision(1) << avg;
    } else {
        cout << "NONE";
    }

}

int main(){
    int n;
    int box[100];
    cin >> n;
    for(int i=0; i<n; i++){
        cin>>box[i];
    }
    A1(box, n);
    cout << " ";
    A2(box, n);
    cout << " ";
    A3(box, n);
    return 0;
}


针对版本一,之前我写错的代码:

#include 
#include 
#include 
using namespace std;

void A1(int a[]){
    int maxInt = 0;
    for(int i=0; i<sizeof(a); i++){
        int temp = 0;
        if(a[i] % 3 == 0){
            temp = a[i];
            if(temp > maxInt){
                maxInt = temp;
            }
        }
    }
    if(maxInt>=3){
        cout<< maxInt;
    }else{
        cout<<"NONE";
    }
}

void A2(int a[]){
    int counts = 0;
    for(int i=0; i<sizeof(a); i++){
        for(int j=1; j<=33; j++){
            if(3*j == a[i]){
                counts++;
            }
        }
    }
    if(counts != 0){
        cout<< counts;
    }else{
        cout<<"NONE";
    }
}

void A3(int a[]){
    int ans[100] = {}; // 所有元素初始化为0
    float avg = 0.0f;
    int sum = 0;
    for(int i=0; i<sizeof(a); i++){
        for(int j=1; j<32; j++){
            if(j*3 == a[i]){
                ans[i] = a[i];
            }
        }
    }
    if(sizeof(ans) != 0){
        for(int i=0; i<sizeof(ans); i++){
            sum += ans[i];
        }
        avg = static_cast<float>(sum)/sizeof(ans);

        cout << fixed << setprecision(1);
    }else{
        cout<<"NONE";
    }
}

int main(){
    int n;
    int box[100];
    for(int i=0; i<n; i++){
        cin>>box[i];
    }
    cout << A1(box) ;
    return 0;
}

错误原因:

在 C++ 中,数组在函数中传递时会退化为指针,因此无法通过 sizeof(a) 获取数组的大小。以下是代码中存在问题的部分以及一些修正建议:

  1. 在函数中传递数组时,建议同时传递数组的大小作为参数,以便在函数内部正确处理数组元素。

  2. 在 C++ 中,sizeof(a) 会返回指针的大小,而不是数组的大小。要获取数组的大小,可以使用 sizeof(a) / sizeof(a[0])。

  3. 在调用函数时,应该将 box 数组作为参数传递给函数,而不是在函数名后面加上 (box)。

  4. 条件的处理过于繁琐,采用双层循环并不能满足题目要求。
    (a[i] - 1) % 3 == 0 和 a[i] % 3 == 1 是等价的。两者都是用来判断是否符合 3K+1 的条件。
    当我们对一个整数进行模运算时,结果的范围是从0到除数减1。在这种情况下,对于除数为3的情况,模运算的结果只能是0、1或2。

对于整数 a,如果 (a - 1) % 3 的结果为0,那么说明 a - 1 是3的倍数,即存在整数 k 使得 a - 1 =3k。进一步推导,我们可以得到 a = 3k + 1。这就符合了 3K+1 的形式。 同样地,如果 a % 3 的结果为1,那么说明 a 是3的倍数加1,即存在整数 k 使得 a = 3k + 1。这也符合了 3K+1 的形式。

因此,(a - 1) % 3 == 0 和 a % 3 == 1 是等价的,都可以用来判断一个整数是否符合 3K+1 的条件。

版本二(更简洁,更推荐)

#include 
#include 
using namespace std;

int main() {
    int n;
    cin >> n;
    
    int a1 = -1, a2 = 0, a3_sum = 0, a3_count = 0;

    for (int i = 0; i < n; i++) {
        int num;
        cin >> num;

        if (num % 3 == 0 && num > a1) {
            a1 = num;
        }

        if ((num - 1) % 3 == 0) {
            a2++;
        }

        if ((num - 2) % 3 == 0) {
            a3_sum += num;
            a3_count++;
        }
    }

    if (a1 >= 3) {
        cout << a1 << " ";
    } else {
        cout << "NONE ";
    }

    if (a2 != 0) {
        cout << a2 << " ";
    } else {
        cout << "NONE ";
    }

    if (a3_count != 0) {
        float a3_avg = static_cast<float>(a3_sum) / a3_count;
        cout << fixed << setprecision(1) << a3_avg;
    } else {
        cout << "NONE";
    }

    return 0;
}

你可能感兴趣的:(PTA_c++,算法,c++)