1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e6+7;
 4 int prime[N];
 5 int dp[N];
 6 int main ()
 7 {
 8     memset (dp,0x3f,sizeof(dp));
 9     for (int i=2;i<N;i++) {
10         if (!prime[i])  { prime[++prime[0]]=i; dp[i]=1; }
11         for (int j=1;j<=prime[0]&&i*prime[j]<N;j++) {
12             prime[i*prime[j]]=1;
13             if (i%prime[j]==0) break;
14         }
15     }
16     dp[1]=0;
17     for (int i=2;i<N;i++) {
18         dp[i]=min (dp[i],dp[i-1]+1);
19         for (int j=1;j<=prime[0]&&i*prime[j]<N;j++)
20             dp[i*prime[j]]=min ( dp[i*prime[j]],dp[i]+1); //核♥: 用已知的这个数与素数相乘去更新比它大的数
21     }23     while (~scanf ("%d",&n)) 
24         printf ("%d\n",dp[n]);
25     return 0;
26 }