📌题目
题目:4622.整数拆分
我们规定 f(x)(x≥2)表示整数 x 的除本身之外的最大因数。
例如,f(6)=3,f(25)=5,f(2)=1
现在,给定一个整数 n,请你将其拆分为 k 份 n1,n2,...,nk(也可以不拆分,即 k=1),要求:
- n1+n2+...+nk=n
- 对于 1≤i≤k,ni≥2 始终成立。
- f(n1)+f(n2)+…+f(nk) 的值应尽可能小。
输出 f(n1)+f(n2)+…+f(nk) 的最小可能值。
输入格式
一个整数 n
输出格式
一个整数,表示f(n1)+f(n2)+…+f(nk) 的最小可能值。
数据范围
前 4 个测试点满足 2≤n≤30。
所有测试点满足 2≤n≤2×109
示例1
示例2
🔎题解
f(x)表示整数 x 的除本身之外的最大因数,那么当x为质数时,f(x)=1,所以这一题其实就是让我们用最少的质数相加得到x,质数的个数就是这一题的答案。
-
那么当x为质数时,f(x)直接就等于1了,不用拆分。
-
当x为偶数时,这里就要讲一个非常著名的猜想:哥德巴赫猜想。哥德巴赫猜想是说,对于任意一个大于2的偶数都可以拆分成两个质数之和(虽然只是猜想,没法验证,但是用起来是完全没问题的)。所以当x为偶数时,结果就是2。
-
当x为奇数时,我们要再分情况考虑:
分析源自->
作者:你好A
链接:https://www.acwing.com/solution/content/140215/
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <cstdio> #include <cmath>
using namespace std;
bool isPrime(int n){ for(int i=2; i<=n/i; i++){ if(n%i==0) return false; } return true; }
int main(){ int n; scanf("%d", &n); if(isPrime(n)) printf("%d", 1); else if(n%2 == 0) printf("%d", 2); else{ if(isPrime(n-2)) printf("%d", 2); else{ printf("%d", 3); } } return 0; }
|