C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++のビット単位のふるい


この問題では、数値Nが与えられます。私たちのタスクは、ビット単位のふるいを使用して、Nよりも小さいすべての素数を見つけることです。

ビット単位のふるいは、エラトステネスのふるいの最適化されたバージョンであり、指定された数よりも小さいすべての素数を見つけるために使用されます。

問題を理解するために例を見てみましょう

入力 − n =25

出力 − 2 3 5 7 11 13 17 19 23

ビット単位のふるいは、通常のふるいと同じように機能します。ブール型の代わりに、素数を表す整数のビットを使用します。これにより、スペースの複雑さが1/8倍に減少します。

解決策を理解するためのコードを見てみましょう。

#include <iostream>
#include <math.h>
#include <cstring>
using namespace std;
bool ifnotPrime(int prime[], int x) {
   return (prime[x/64]&(1<<((x>>1)&31)));
}
bool makeComposite(int prime[], int x) {
   prime[x/64]|=(1<<((x>>1)&31));
}
void bitWiseSieve(int n){
   int prime[n/64];
   memset(prime, 0, sizeof(prime));
   for (int i = 3; i<= sqrt(n); i= i+2) {
      if (!ifnotPrime(prime, i))
      for (int j=pow(i,2), k= i<<1; j<n; j+=k)
      makeComposite(prime, j);
   }
   for (int i = 3; i <= n; i += 2)
   if (!ifnotPrime(prime, i))
      printf("%d\t", i);
}
int main(){
   int N = 37;
   printf("All the prime number less than %d are 2\t", N);
   bitWiseSieve(N);
   return 0;
}

出力

All the prime number less than 37 are 2 3 5 7 11 13 17 19 23 29 31 37

  1. C++の配列内のすべての素数の積

    いくつかの要素を持つ整数配列arr[]が与えられた場合、タスクはその数のすべての素数の積を見つけることです。 素数は、1で割った数、またはその数自体です。または、素数は、1とその数自体を除いて他の数で割り切れない数です。 1、2、3、5、7、11など 与えられた配列の解を見つける必要があります- 入力 −arr [] ={11、20、31、4、5、6、70} 出力 − 1705 説明 −配列の素数は− 11、31、5であり、それらの積は1705 入力 − arr [] ={1、2、3、4、5、6、7} 出力 − 210 説明 −配列の素数は− 1、2、3、5、7

  2. C++で配列のビットごとのORを最大化する

    問題の説明 N個の整数の配列が与えられます。配列のすべての要素のビットごとのORは、1つのタスクを実行することによって最大化する必要があります。タスクは、配列の任意の要素に、指定された整数xを最大k回乗算することです。 入力配列が{4、3、6、1}、k =2、x =3の場合、取得できる最大値は55です。 アルゴリズム 1. multiply an array element with (x^k) and do bitwise OR it with the bitwise OR of all previous elements 2. Multiply an array element wit