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 ",dp[n]); 25 return 0; 26 }