首先,本题根据“某正整数可被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;
}



京公网安备 11010502036488号