Friday, January 13, 2012

Function of Storing Factors of 1 to n! ( N factorial)

#include<stdio.h>
#include<string.h>
#include<math.h>


#define SZ 1000005


long prime[78600] ,c = 0 , store[SZ][8];
bool flag[SZ];


void seive();
void store1_to_nfact();


int main()
{
long n ,i ,p ,e ,x;
seive();
store1_to_nfact();
while(scanf("%ld" , &n)==1 && n)
{
for(i = 0;i<8;i++)
{
x = store[n][i];
e = (x&31);
p = x>>5;
if(p!=0)
printf("%ld^%ld\n" , p , e);
else
break;
}
}
return 0;
}


void seive()
{
long i ,j ,r;
flag[0] = flag[1] = true;


for(i = 4;i<SZ;i+=2)
flag[i] = true;
prime[c++] = 2;
for(i = 3;i<SZ;i+=2)
{
if(!flag[i])
{
prime[c++] = i;
if(SZ/i>=i)
{
r = i*2;
for(j = i*i;j<SZ;j+=r)
flag[j] = true;
}
}
}
}


void store1_to_nfact()
{
long count,i ,root,j , freq ,temp , p , x;
store[0][0] = store[1][0] = 0;


for(i = 2;i<SZ;i++)
{
count = 0;
if(!flag[i])
{
x = i;
x = ((x<<5)|1);
store[i][0] = x;
}
else
{
temp = i;
root = (long)sqrt(i);
for(j = 0;prime[j]<=root;j++)
{
p = 0;
if(temp%prime[j]==0)
{
freq = 0;
while(temp%prime[j]==0)
{
freq++;
temp/=prime[j];
}
x = prime[j];
x = ((x<<5)|freq);
store[i][count++] = x;


if(!flag[temp])
{
x = temp;
x = ((x<<5)|1);
store[i][count++] = x;
p = 1;
break;
}
root = (long)sqrt(temp);
}
if(p==1)
break;
}
}
}
}

No comments:

Post a Comment