ham*_*mza -1 c++ binary primes
我想创建一个程序,将所有素数写入文件中(我知道有一个流行的算法"Sieve of Eratosthenes",但我试图自己制作).我正在尝试消除仍然具有值1的字节的所有复杂性,然后将它们写入文件中.
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
void afficher_sur_un_ficher (FILE* ficher, int nb_bit);
char el_mask (int x);
int main()
{
FILE* p_fich;
char tab[4096], mask, eli_mask;
int nb_bit = 0, x, f;
for (int i = 0; i < 4096; i++)
{
tab[i] = 0xff;
}
for (int i = 0; i < 4096; i++)
{
for (mask = 0x01; mask != 0; mask <<= 1)
{
if ((tab[i] & mask) != 0)
{
x = nb_bit;
while ((x > 1) && (x < 16384))
{
eli_mask = el_mask (x);
f = x / 8;
tab[f] = tab[f] ^ eli_mask;
x = x + nb_bit;
}
afficher_sur_un_ficher (p_fich, nb_bit);
}
nb_bit++;
}
}
system ("PAUSE");
return 0;
}
void afficher_sur_un_ficher (FILE* ficher, int nb_bit)
{
ficher = fopen ("res.txt", "a+");
fprintf (ficher, "%d \t", nb_bit);
int static z;
z = z + 1;
if (z % 10 == 0)
fprintf (ficher, "\n");
fclose (ficher);
}
char el_mask (int x)
{
x = x % 8;
switch (x)
{
case 0:
x = 0b00000001;
break;
case 1:
x = 0b00000010;
break;
case 2:
x = 0b00000100;
break;
case 3:
x = 0b00001000;
break;
case 4:
x = 0b00010000;
break;
case 5 :
x = 0b00100000;
break;
case 6 :
x = 0b01000000;
break;
case 7:
x = 0b10000000;
break;
}
return x;
}
Run Code Online (Sandbox Code Playgroud)
循环中似乎存在一个问题,即试图清除指示非素数的位:
while (( x > 1 )&&(x < 16384))
{
tab[i] = tab[i] ^ mask ;
x = x * 2 ;
}
Run Code Online (Sandbox Code Playgroud)
由于i在此循环中没有改变,因此在递增时基本上会关闭和打开相同的位x.除了修改索引之外tab[],您可能希望将操作从xor(^)更改为无条件清除该位的操作 - 一旦清除该位,您不希望再次处理该位以获取另一个因素来重置'有点.注意,简单的递增i不会这样做,因为x其他元素的倍数tab可能不在同一位偏移中(实际上,单个元素tab[]可能包含几个倍数x).
即使您解决了这个问题,我认为循环可能没有按照您的预期进行,因为x = x * 2;不会x遍历它的倍数 - 您最终会跳过一些非素数.
关于"Eratosthenes的筛子"如何工作的一些研究可能会有所帮助.