题目链接:https://vjudge.net/contest/208482#problem/G
题意描述:有n元钱,需要交税,交锐的价格为n 的最大因子(不等于n),为了缩小税钱,你可以拆成多个钱相加的形式,但是不能拆出1来,问你最少交多少钱?
数据范围:(2 ≤ n ≤ 2·109)
解题思路:本题需要用到两个定理:
三素数定理:大于2的奇数都可以拆成三个奇素数和的形式
但本题中,该奇数如果可以写成2+奇素数,则为两个素数和。。。 (素数和,因为2不是奇素数)
哥德巴赫猜想:任一大于2的偶数都可写成两个素之和。
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
long long n;
int pd(long long x)
{
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0) return 0;
}
return 1;
}
int main()
{
cin>>n;
if(pd(n))
{
cout<<1<<endl;
return 0;
}
if(n==2)
{
cout<<1<<endl;
return 0;
}
if(n%2)
{
if(pd(n-2))
cout<<2<<endl;
else
cout<<3<<endl;
}
else
{
cout<<2<<endl;
return 0;
}
}