📌题目
题目: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; }
   |