题目重述
读入一个非负整数, 判断该数能否被3和11整除. 注意该数可能很大, 它的范围为[0, 10^200].
Standard Input
有多组测试数据.输入的第一行是整数T(1<=T<=200), 表示随后测试数据的组数. 每组测试数据占一行, 由要判断的整数构成.
Standard Output
对应每组测试数据, 输出一行判断的结果. 第一单词(Yes或No)表示该数能否被3整除, 第二个单词(Yes或No)表示该数能否被11整除, 两个字符串之间用一个空格隔开.
注意到这个数的最大值可以取到
1
0
20
10^{20}
1020,而long long最大存储的数为19位数,所以放弃用long long来定义数x.选择用字符串的方式写这个数(还是注意转换为数时 -‘0’),这里就涉及了一点点数学方法:、
对于数x每一位数字之和为3的倍数则这个数可以被3整除;奇数位数字之和与偶数位数字之和的差值如果是11的倍数,则这个数可以被11整除。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;
string s;
cin>>T;
while(T--){
string s;
cin>>s;
//是否是3的倍数?
int sum=0;
for(int i=0;i<s.length();i++){
sum+=(s[i]-'0');
}
if(sum%3==0){
cout<<"Yes"<<" ";
}else{
cout<<"No"<<" ";
}
//是否是11的倍数
int sum1=0,sum2=0;
for(int i=0;i<s.length();i+=2){
sum1+=(s[i]-'0');//奇数位之和
}
for(int i=1;i<s.length();i+=2){
sum2+=(s[i]-'0');//偶数位之和
}
if((sum1-sum2)%11==0){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
return 0;
}