2401_82872417 2024-07-29 21:49 采纳率: 100%
浏览 27
已结题

程序发生了未经处理的异常0x00007FF73E6F2BA7

![alt](url)

img

#include<iostream>
using namespace std;

const int n = 5e5 + 10;

//看余数和为多少的数
int sum = 0;
//
void solve()
{
    sum = 0;
    int x;
    cin >> x;
    //存余数的数组
        int a[n] = { 0 };
    for (int i = 1; i <= x; i++)
    {//输入的数
        int b;
        cin >> b;
        
        a[b % 3]++;
        sum += b;
        if (sum % 3 == 0)
        {
            cout<<"0\n";
        }
        else if (sum % 3 == 2)
        {
            cout<<"1\n" ;
        }
        if (sum % 3 == 0)cout << "0\n";
        else if (sum % 3 == 2)cout << "1\n";
        else if (sum % 3 == 1 && a[1])cout << "1\n";
        else cout << "2\n";
    }
}
int main()
{
    //进行t组
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}
  • 写回答

1条回答 默认 最新

  • 莫蘅 2024-07-30 15:02
    关注

    你当前的代码有一些逻辑和输出上的错误,特别是在判断和输出余数时。你不需要在每次循环中多次输出结果,而且逻辑判断存在重复和不一致之处。以下是修正和优化后的代码:

    #include <iostream>
    using namespace std;
    
    const int n = 5e5 + 10;
    
    void solve() {
        int sum = 0;
        int x;
        cin >> x;
        int a[3] = {0}; // 存余数的数组,只需要大小为3,因为我们只关心 b % 3 的结果
    
        for (int i = 0; i < x; i++) { // 输入的数
            int b;
            cin >> b;
            
            a[b % 3]++;
            sum += b;
        }
    
        // 输出结果
        if (sum % 3 == 0) {
            cout << "0\n";
        } else if (sum % 3 == 1) {
            if (a[1] > 0) {
                cout << "1\n";
            } else if (a[2] >= 2) {
                cout << "2\n";
            } else {
                cout << "-1\n"; // 无法通过删除一个或两个元素使得和为3的倍数
            }
        } else if (sum % 3 == 2) {
            if (a[2] > 0) {
                cout << "1\n";
            } else if (a[1] >= 2) {
                cout << "2\n";
            } else {
                cout << "-1\n"; // 无法通过删除一个或两个元素使得和为3的倍数
            }
        }
    }
    
    int main() {
        int t;
        cin >> t;
        while (t--) {
            solve();
        }
        return 0;
    }
    

    修改后的代码说明

    1. 全局数组大小: const int n = 5e5 + 10; 保留了这个全局常量,以确保数组的大小足够大。
    2. 输入处理和余数统计: 使用一个大小为3的数组 a[3] 来记录余数分别为0、1、2的数的个数。这样可以更加高效地处理和判断。
    3. 逻辑判断和输出:
      • 和为3的倍数: 直接输出0。
      • 和为3余1:
        • 如果存在一个余1的数,输出1。
        • 否则如果存在至少两个余2的数,输出2。
        • 如果以上条件都不满足,输出-1。
      • 和为3余2:
        • 如果存在一个余2的数,输出1。
        • 否则如果存在至少两个余1的数,输出2。
        • 如果以上条件都不满足,输出-1。

    这个逻辑更加简洁,避免了重复和不必要的输出,确保程序按照预期运行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月9日
  • 已采纳回答 8月1日
  • 创建了问题 7月29日