Pagini recente » Cod sursa (job #2429134) | Cod sursa (job #1318853) | Cod sursa (job #240097) | Cod sursa (job #1720095) | Cod sursa (job #1010825)
#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;
}