一道模拟题。
纯模拟肯定不行,考虑优化。\(60 = 2^2 \times 3 \times 5\),也就是说我们判断组合后的数字能否被 \(2\),\(3\),\(10\) 整除即可。
如果这个数能被 \(2\) 整除,那么原数一定会存在偶数;如果这个数能被 \(3\) 整除,那么它的数字和应该也能被 \(3\) 整除;如果这个数能被 \(10\) 整除,那么原数一定存在 \(0\)。
值得注意的是,如果原数只出现过一个 \(0\),那么该数是不能被 \(10\) 和 \(2\) 同时整除的。因此,我们还需要判断一下原数是否有除了 \(0\) 以外的偶数或者 \(2\) 个以上的 \(0\)。
Code
#include <bits/stdc++.h>
#define ll long long
#define INF 1e9
using namespace std;
int n;
signed main() {
ios :: sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= n; i++) {
string s; // 不要用 int,否则会出错
int sum = 0, cnt1 = 0, cnt2 = 0; // sum 是数位和,cnt1 是 0 的个数,cnt2 是除了 0 以外的偶数的个数
bool flag1 = 0, flag2 = 0, flag3 = 0; // flag1 判断能否被 3 整除,flag2 判断能否被 10 整除,flag3 判断能够被 2 整除
cin >> s;
for (int i = 0; i < s.size(); i++) {
int num = s[i] - '0';
sum += num;
if (num == 0) cnt1++;
else if (num % 2 == 0) cnt2++;
}
if (sum % 3 == 0) flag1 = 1;
if (cnt1) flag2 = 1;
if (cnt2 or cnt1 > 1) flag3 = 1; // 如果有两个 0 也可以
if (flag1 and flag2 and flag3) cout << "red\n";
else cout << "cyan\n";
}
return 0;
}
标签:int,题解,Competitive,数能,num,cnt1,Programmer,原数,整除
From: https://www.cnblogs.com/xvl-/p/17467864.html