算法竞赛入门经典:第十章 数学概念与方法 10.2无平方因子的数
2015-08-19 09:51
162 查看
/* 无平方因子的数: 给出正整数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 <stdio.h> #include <string.h> #include <math.h> #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; }
相关文章推荐
- POJ 2236 Wireless Network
- Welcome to Zhip.Fang's CnBlog
- onWindowFocusChanged
- iOS 浅谈AFNetwork
- Linux 进程管理
- C++ STL基本容器的使用
- AC自动机
- .net从服务器下载文件中文名乱码解决方案
- 关于盒子二三事
- 链表的基本操作
- C/S和B/S性能介绍及优缺点分析
- 算法竞赛入门经典:第十章 数学概念与方法 10.1除法表达式
- mysql 命令篇
- linux技术交流
- 程序员爱情文学
- PowerPC PPC460-S MMU(五 Storage Control Registers)
- Unity3D性能优化之角色建模
- UCGUN WM API 函数
- python 之 threading 模块
- Qt5.2连接SQLServer2008