Cod sursa(job #1010825)

Utilizator nod_softwareBudisteanu Ionut Alexandru nod_software Data 15 octombrie 2013 19:21:47
Problema Ciurul lui Eratosthenes Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.85 kb
#include <stdio.h>
#include <stdlib.h>
//------------------------------
void ReadData(int *iN)
{
    FILE * fIn = fopen("ciur.in","r");

    fscanf(fIn,"%d",iN);

    fclose(fIn);
}
//-----------------------------------
int GetBit(int * vArray, int iLength, int iBitIndex)
{
   if (iBitIndex > iLength) return -1;

   int iBitMask = 1 << (iBitIndex % (sizeof(int)*8));
   return (vArray[iBitIndex / (sizeof(int)*8)] & iBitMask);
}
//-----------------------------------
int SetBit(int *vArray, int iLength, int iBitIndex, int iBitValue)
{
    if (iBitIndex > iLength) return -1;

    int iBitMask = 1 << (iBitIndex % (sizeof(int)*8));

    if (iBitValue == 1)
        vArray[iBitIndex / (8*sizeof(int))] |= iBitMask;
    else
        vArray[iBitIndex / (8*sizeof(int))] &=~iBitMask;

    return 1;
}
//-----------------------------------
void PrintSolution(int *vArray, int iN)
{
    int i,iCount=0;
    for (i=2; i<=iN; i++)
        if (GetBit(vArray,iN,i)==0)
            iCount++;

    FILE *fOut= fopen("ciur.out","w");

    fprintf(fOut,"%d",iCount);

    fclose(fOut);
}
//-----------------------------------
int main()
{
    int iN,i;
    ReadData(&iN);

    //in C++ puteam folosi bool, care face acelasi lucru pe operatii pe biti
    //bool vPrimes[2000000];

    //Calculam cate integere trebuie sa salvez astfel incat sa retin exact n numere
    int iNumberOfBytesUsed=iN / (8*sizeof(int))+1;
    int vPrimes[iNumberOfBytesUsed];


    for (i=0; i<iNumberOfBytesUsed; i++)
        vPrimes[i]=0;

    for (i=2; i<=iN; i++)
    {
        if (GetBit(vPrimes,iN,i)==0)
        {
            int iJ=2,iNumber=i;

            while (iNumber*iJ<=iN)
            {
                SetBit(vPrimes,iN,iNumber*iJ,1);
                iJ++;
            }
        }
    }

    PrintSolution(vPrimes,iN);

    return 0;
}