算法竞赛入门经典:第十章 数学概念与方法 10.2无平方因子的数

/*
无平方因子的数:
给出正整数n和m,区间[n,m]内的“无平方因子”的数有多少个?整数p无平方因子当且仅当不存在k>1,使得p是k^2的倍数。1<=n<=m<=10^12,m-n<=10^7

分析:
需要判断10^7个整数,每个整数需要时间判断是否没有平方因子。
方法:
利用素数筛选法,对不超过n的每个非负整数p,删除2p,3p,..,当处理完所有数之后,还没有被删除的就是素数

如何求出无平方因子的数:
1素数筛选法
2 对于不超过根号m下所有素数p,筛掉区间[n,m]内p^2的所有倍数
*/

/*
关键:
1 素数定理:
Pai(x)~x/lnx,Pai(x)表示不超过x的素数的个数
2 对于不超过根号m下所有素数p,筛掉区间[n,m]内p^2的所有倍数
*/
#include 
#include 
#include 

#define MAXSIZE 1000000

int iPrime[MAXSIZE];
int iVis[MAXSIZE];

void delMultiple(long n,long m)//从素数中筛掉区间[n,m]内p^2的所有倍数
{
	long j = (int)sqrt(m+0.5);
	for(long i = n ; i <= j ;i++)
	{
		if(!iPrime[i])
		{
		}
	}
}

void isPrime(long long n,long long m)
{
	memset(iVis,0,sizeof(iVis));
	int c = 0;
	long j = (int)sqrt(m+0.5);//素数筛选法其实不需要到最大的数,一般只要到平方即可
	for(long i = 2 ; i <= j; i++)
	{
		if(!iVis[i])
		{
			iPrime[c++] = i;
		}
		for(long k = i*i ; k <= m; k += i)
		{
			iVis[i] = 1;
		}
	}
	delMultiple(n,m);
}

void process()
{
	long long n,m;
	while(EOF != scanf("%ld %ld",&n,&m))
	{
		isPrime(n,m);
	}
}

int main(int argc,char* argv[])
{
	getchar();
	return 0;
}

你可能感兴趣的:(刘汝佳算法竞赛入门经典)