C++ 位数最大1e5所以不能直接除。规律:一个数能被9整除,当且仅当它的各位数字之和能被9整除

#include <array>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    // 一个数能被9整除,当且仅当它的各位数字之和能被9整除
    // x^2 < 10 即 x=2或3
    // n%9==0 || (n+i*(4-2)+j*(9-3))%9==0
    int t;
    cin >> t;
    while (t--) {
        string a;
        cin >> a;
        vector<int> n;
        for (auto i:a) {
            n.push_back(i-'0');
        }
        // cout << n%9 << endl;
        // 最长可是有10^5位
        int s=0, cnt2=0, cnt3=0;
        for (auto i:n) {
            s += i;
            if (i==2) cnt2++;
            else if (i==3) cnt3++;
        }
        // cout << s << ' ' << cnt2 << ' ' << cnt3 << endl;
        if (s%9==0) cout << "YES" << endl;
        else {
            int f=0;
            for (int i=0; i<=cnt2; i++) {
                for (int j=0; j<=cnt3; j++) {
                    if ((s+2*i+6*j)%9==0) {
                        f=1;
                        break;
                    }
                }
                if (f) break;
            }
            if (f) cout << "YES" << endl;
            else cout << "NO" << endl; 
        }
        
    }
}
// 64 位输出请用 printf("%lld")