题目链接:XDOJ-1028-数字工程
先把素数筛出来,然后从1往后面dp就行了。。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
bool vis[maxn];
int dp[maxn],prime[maxn];
int main()
{
int m=0;
for(int i=2;i<maxn;i++)
{
if(!vis[i])
{
prime[m++]=i;
for(int j=i*2;j<maxn;j+=i)
vis[j]=true;
}
}
memset(dp,0x3f,sizeof(dp));
dp[1]=0;
for(int i=1;i<maxn;i++)
{
dp[i+1]=min(dp[i+1],dp[i]+1);
for(int j=0;j<m;j++)
{
int k=prime[j]*i;
if(k>=maxn) break;
dp[k]=min(dp[k],dp[i]+1);
}
}
int n;
while(~scanf("%d",&n))
{
printf("%d\n",dp[n]);
}
return 0;
}