题目链接:
https://codeforces.com/problemset/problem/1562/B
题目大意:
t 组测试,每组第一行为数字字符串长度 n ,第二行为数字字符串,要求删除其中的一些数(不可以全删),获得非质数。输出第一行为最后字符串的长度,第二行为最后的字符串。
思路:
可以证明对于任意 三位数 ,删除其中一位或者两位可以得到一个非素数。(可以通过暴力跑出来)
当字符串中包含 1,4,6,8,9 时,其它数可以全部删除。而三位数及以上都可以转化为两位数,那么可以通过 暴力 跑出 100 以内的质数。
如果不包含上述的特殊的数字,就通过暴力枚举字符串中任意两个字符的组合,去找到最短的可能。
代码:
#include <bits/stdc++.h>
using namespace std;
bool prime[105];
int n;
string s;
void solve(){
for (int i = 0; i < n; i++){
if (s[i] == '1' || s[i] == '4' || s[i] == '6' || s[i] == '8' || s[i] == '9'){ //判断是否含有特殊的一位数
cout << 1 << '\n' << s[i] << '\n';
return;
}
}
for (int i = 0; i < n; i++){ //判断两位的特殊组合
for (int j = i + 1; j < n; j++){
if (!prime[(s[i] - '0') * 10 + s[j] - '0']){
cout << 2 << '\n' << s[i] << s[j] << '\n';
return;
}
}
}
}
int main(){
for (int i = 2; i < 100; i++){ //找出 100 以内的素数
prime[i] = true;
for (int j = 2; j * j <= i; j++){ if (i % j == 0) prime[i] = false;}
}
int t;
cin >> t;
while (t--){
scanf("%d", &n);
cin >> s;
solve();
}
return 0;
}