码蹄杯 拼质数 题型:分类讨论 难度:白银

110 阅读1分钟

码题集OJ-拼质数 (matiji.net) image.png

样例输入1

1 2 3 4

样例输出1

2

样例输入2

6 1 10 8

样例输出2

7

样例输出3

9 9 6 12

样例输出4

impossible

思想

这道题要分类讨论

有可能4个数每个数都是素数,那么我们就要输出其中最小的一个素数.

有可能每个数都不是素数,但是相加和却是素数.

而这又分为好几种情况:

一组(两个数)相加和为素数

三个数相加和为素数

四个数相加和为素数

我们都要取一个min

code

#include<bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f
using namespace std;

bool isprime(int x) {
	if (x < 2) return false;
	for (int i = 2; i * i <= x; i++) {
		if (x % i == 0) return false;
	}
	return true;
}

int ans = INF, sum;
signed main() {
	int a[10];
	for (int i = 0; i < 4; i++)cin >> a[i];
	sum = a[0] + a[1] + a[2] + a[3];

	sort(a, a + 4);
	//单个素数的情况
	for (int i = 0; i < 4; i++)
		if (isprime(a[i]))
			ans = min(ans, a[i]);


	//两个素数的情况
	for (int i = 0; i < 4; i++)
		for (int j = i + 1; j < 4; j++)
			if (isprime(a[i] + a[j]))
				ans = min(ans, a[i] + a[j]);

	//三个素数的情况
	for (int i = 0; i < 4; i++)
		if (isprime(sum - a[i]))
			ans = min(ans, sum - a[i]);

	//四个素数的情况
	if (isprime(a[0] + a[1] + a[2] + a[3])) {
		ans = min(ans, a[0] + a[1] + a[2] + a[3]);
	}

	if (ans == INF) cout << "impossible" << endl;
	else cout << ans << endl;

	return 0;
}

image.png