1 2 3 4 5
0 1 2 1 3
我的思路 先打了素数表 再用二分查找去找最大的素数。。结果果断TLE了
代码在此:
#include<stdio.h> int YNprime[1000001]; int prime[200000]; int totprime=1; int getprime(int maxN) { int i,j,k; for(i=2;i<=maxN;i++) if(YNprime[i]==0) { prime[totprime++]=i; for(j=2;i*j<=maxN;j++) YNprime[i*j]=1; } return 1; } int find(int s,int t,int N) { int i; int m=(s+t)/2; if(s==t) return s; if(prime[m]>N) return find(s,m,N); if(prime[m]<N) return find(m+1,t,N); else return m; } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); int n,i,ans,k; getprime(1000000); while(scanf("%d",&n)!=EOF) { ans=0; if(n==1) {printf("0\n");continue;} k=find(1,totprime-1,n); for(i=k+10;i>=1;i--) if(n%prime[i]==0) {ans=i;break;} printf("%d\n",ans); } return 0; }结果发现沙茶了
筛选法的时候就能直接找最大的素数
#include <cstdio> #include <iostream> using namespace std; #define Maxl 1000005 int prime[Maxl]; int rank[Maxl]; int main() { int k = 0, i, j; for (i =2; i < Maxl; i++) { if (prime[i] == 0) { rank[i] = ++k; for (j = i; j < Maxl; j += i) { prime[j] = i; } } } prime[1] = 0; int n; while(scanf("%d", &n) == 1) { if(n == 1) { printf("0\n"); continue; } int k = prime[n]; printf("%d\n", rank[k]); } }