首先,本题根据“某正整数可被9整除,当且仅当该数的各个数位的数字之和能被9整除”的数学思想,计算出该数各数位数字之和。注意将char转换为int时使用s[i]-'0'而非static_cast<int> (s[i]),后者是将字符转换成了ascll码。其次,使用暴力枚举的解法,根据各数之和对9取模的结果进行分类讨论。注意:当k%9为偶数时,需要多凑一个9.例如,当k%9==6时,本需凑3,无法凑到,故凑3+9=12,此时便可以凑2*6等。

#include <iostream>
#include <algorithm>
using namespace std;
int get_sum(string s){
    int sum=0;
    for(int i=0;i<s.size();i++) sum+=(s[i]-'0');        //注意:不要使用static_cast<int>!
    return sum;
}

int main(){
    int t,m,n;
    string s;
    cin>>t;
    for(int i=0;i<t;i++){
        cin>>s;
        int k=get_sum(s);
        if(k%9==0) cout<<"YES"<<endl;
        else{
            m=count(s.begin(),s.end(),'2');        //注意2要加上引号,表示char类型!
            n=count(s.begin(),s.end(),'3');
            if(k%9==1){
                if(m>=4||(m>=1 && n>=1)) cout<<"YES"<<endl;
                else cout<<"NO"<<endl;
            }
            else if(k%9==2){
                if(m>=8||(m>=5&&n>=1)||(m>=2&&n>=2)) cout<<"YES"<<endl;
                else cout<<"NO"<<endl;
            }
            else if(k%9==3){
                if(m>=3||n>=1) cout<<"YES"<<endl;
                else cout<<"NO"<<endl;
            }
            else if(k%9==4){
                if(m>=7||(m>=4&&n>=1)||(m>=1&&n>=2)) cout<<"YES"<<endl;
                else cout<<"NO"<<endl;
            }
            else if(k%9==5){
                if(m>=2) cout<<"YES"<<endl;
                else cout<<"NO"<<endl;
            }
            else if(k%9==6){
                if(m>=6||(m>=3&&n>=1)||n>=2) cout<<"YES"<<endl;
                else cout<<"NO"<<endl;
            }
            else if(k%9==7){
                if(m>=1) cout<<"YES"<<endl;
                else cout<<"NO"<<endl;
            }
            else{
                if(m>=5||(m>=2&&n>=1)) cout<<"YES"<<endl;
                else cout<<"NO"<<endl;
            }
        }
    }
    return 0;
}