Advertisement
wojiaocbj

Untitled

Jun 14th, 2022
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.37 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <math.h>
  5. #include <string.h>
  6. #include <assert.h>
  7. #pragma warning(disable:4996)
  8. typedef long long LL;
  9. int primes[10000010] = {0};//primes[0]计数
  10. int vis[10000010] = {0};
  11. void initprimes(int *primetable,int *visit,int n){
  12.     int i,j;
  13.     for(i = 2;i <= n;i++){
  14.         if(!visit[i]){
  15.             primetable[++primetable[0]] = i;
  16.         }
  17.         for(j = 1;j <= primetable[0] && i * primetable[j] <= n;j++){
  18.             vis[i * primes[j]] = 1;
  19.             if(i % primes[j] == 0)break;
  20.         }
  21.     }
  22. }
  23. void *lowerbound(void *base,void *key,size_t count,size_t itemsize,int(*compare)(const void *,const void *)){
  24.     assert(base && compare);
  25.     size_t lo = 0,hi = count - 1,mid = 0;
  26.     if(compare(key,(char *)base + hi * itemsize) > 0){
  27.         return (char *)base + count * itemsize;
  28.     }
  29.     char *pmid = 0;
  30.     while(lo < hi){
  31.         mid = (lo + hi) >> 1;
  32.         pmid = ((char *)base) + mid * itemsize;
  33.         if(compare(pmid,key) < 0){
  34.             lo = mid + 1;
  35.         }
  36.         else{
  37.             hi = mid;
  38.         }
  39.     }
  40.     return (char *)base + lo * itemsize;
  41. }
  42. void *upperbound(void *base,void *key,size_t count,size_t itemsize,int(*compare)(const void *,const void *)){
  43.     assert(base && compare);
  44.     size_t lo = 0,hi = count - 1,mid;
  45.     if(compare(key,(char *)base + hi * itemsize) >= 0){
  46.         return (char *)base + count * itemsize;
  47.     }
  48.     char *pmid = 0;
  49.     while(lo < hi){
  50.         mid = (lo + hi) >> 1;
  51.         char *pmid = ((char *)base) + mid * itemsize;
  52.         if(compare(pmid,key) <= 0){
  53.             lo = mid + 1;
  54.         }
  55.         else{
  56.             hi = mid;
  57.         }
  58.     }
  59.     return (char *)base + lo * itemsize;
  60. }
  61. int cmp(const void *a,const void *b){
  62.     int p = *(int *)a,q = *(int *)b;
  63.     if(p > q)return 1;
  64.     else if(p < q)return -1;
  65.     else return 0;
  66. }
  67. int main(){
  68. #ifdef _DEBUG
  69.     freopen("input.txt","r",stdin);
  70. #ifdef OFILE
  71.     freopen("test.txt","w",stdout);
  72. #endif
  73. #endif
  74.     int n;
  75.     initprimes(primes,vis,10000000);
  76.     while(~scanf("%d",&n)){
  77.         int pos = (int *)upperbound(primes + 1,&n,primes[0],sizeof(int),cmp) - primes - 1;
  78.         printf("%d\n",pos);
  79.     }
  80. #ifdef _DEBUG
  81.     freopen("CON","r",stdin);
  82. #ifdef OFILE
  83.     freopen("CON","w",stdout);
  84. #endif
  85.     system("pause");
  86. #endif
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement