大体题意:
你有n元钱,你需要交税,交锐的价格为n 的最大因子(不等于n),为了缩小税钱,你可以拆成多个钱相加的形式,但是不能拆出1来,问你最少交多少钱?
思路:
肯定是全都是素数最好了,那么问题就是把n 拆成多个素数之和的形式!
根据哥德巴赫猜想,任何大于2 的偶数必定写成两个质数相加的形式!
因为我们判断 如果n 本身时素数直接输出1
如果不是素数, 是偶数的话,直接输出2
如果是奇数,两个形式:
1. 2 加上一个 奇素数, 即判断n-2是不是素数 答案是2
2. 一个偶数加上一个奇素数, 答案是3
之所以奇数分成两类 是因为 素数不可能是偶数,奇数不可能由两个素数相加得来!
讨论就好了!
判断素数用唯一分解定理即可判断了!
详细见代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int>v;
bool is_p(int n){
int m = sqrt(n) + 1;
int nn = n;
v.clear();
for (int i = 2; i <= m; ++i){
if (n % i == 0){
v.push_back(i);
while(n % i == 0) n/= i;
}
}
if (n != 1) v.push_back(n);
if ((int)v.size() == 1 && v.back() == nn) return 1;
return 0;
}
int main(){
int n;
scanf("%d",&n);
if (is_p(n)) return 0 * puts("1");
if (!(n & 1)) puts("2");
else {
if (is_p(n-2)) puts("2");
else puts("3");
}
return 0;
}