为什么这段代码不能正常工作?

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)

Mic*_*urr 5

循环中似乎存在一个问题,即试图清除指示非素数的位:

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的筛子"如何工作的一些研究可能会有所帮助.