我们知道每一位数加起来是9的倍数的可以被9整除,diffNine代表了所有位加起来还差多少能被9整除,比如diffNine算得2,问题变成了需要多少2(由2->4位和增加2),6(由3->9位和增加6)组合得到2+9n。通过遍历得到2,3的个数,设为m,n。即: 2m+6n=diff+9k , k为自然数 =====> (2m+6n)%9 = diff。遍历找到是否有合适的组合即可。

#include <iostream>
using namespace std;

int diffNine(string num, int& twoNum, int& threeNum) {
    int sum = 0;
    for (auto c : num) {
        if (c == '2')twoNum++;
        if (c == '3')threeNum++;
        sum += c - '0';
    }
    return 9 - sum % 9;
}

int main() {
    int t;
    cin >> t;
    while (t--) { // 注意 while 处理多个 case
        string s;
        cin >> s;
        int threeNum = 0, twoNum = 0;
        int diff = diffNine(s, twoNum, threeNum);
        if (diff == 9) {
            cout << "YES" << endl;
            continue;
        }
        int flag = 1;
        // cout << twoNum << ' ' << threeNum << endl;
        for (int i = 0; i <= twoNum && flag; ++i) {
            for (int j = 0; j <= threeNum && flag; ++j) {
                int temp = 2 * i + 6 * j;
                if (temp % 9 == diff) {
                    cout << "YES" << endl;
                    flag = 0;
                }
            }
        }
        if (flag)cout << "NO" << endl;
    }
    return 0;
}