题目链接:

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;
}
posted on 2021-09-13 11:15  Hamine  阅读(71)  评论(0编辑  收藏  举报