素数求解问题及优化
2016-04-03 17:49
274 查看
素数求解问题及优化
1描述
素数求解问题在程序员的面试中是个很简单的问题,经常是小公司的基础面试题。然而因为一些个小紧张什么的,弄跪了些许人那么,今天就关于这个问题我们来进行总结及方案优化
素数概念:除了1和它本身不能被其他数整除的数字都是素数
我们就围绕 bool IsPrime(int n) 判断一个数是否为素数来谈吧
2实现
①依据概念实现bool IsPrime(int n)
{
if(n < 2)
return false;
for(int i = 2;i<n;++i)
{
if(n%i==0)
reurn false;
}
return true;
}
②优化一:因为偶数必然不为素数,所以i+=2;
bool IsPrime(int n)
{
if(n < 2)
return false;
if(n == 2)
return true;
for(int i = 3; i < n;i+=2)
{
if(n%i==0)
return false;
}
return true;
}
优化二:eg 对于100;大于50的数字必然不能整除100;所以i<n/2;
优化三:对于数字M,要确定一个整除它的数字k,会有k1*K2==M,那么,K1,K2如何才能最小呢,那就是K1==K2,所以优化为i*i<n;
bool IsPrime(int n)
{
if(n<2)
return false;
for(int i =2;i*i < n;++i)
{
if(n%i==0)
return false;
}
return true;
}
优化四:素数表方案求解
分析:
对于一个合数,进行因式分解,最终得到的会是一些个质数只积,那么就有如果一个数无法被比他小的质数整除,那么他本身也是素数
所以就有素数表方案求解素数问题的提出。关于M以内质数个数的估算结果是:
//int nMaxLen=static_cast<int> ((n/log(double(n)))*1.5);
void PrintPrimeInN(int n)
{
int nMaxLen=static_cast<int> ((n/log(double(n)))*1.5);
int *arr = new int[nMaxLen];
int count = 0;
arr[count++] = 2;
for(int i = 2;i<=n;++i)
{
int flag = true;
for(int j =0;arr[j]*arr[j] < i;++j)
{
if(i%arr[j] == 0)
{
flag = false;
break;
}
}
if(flag)
arr[count++] = i;
}
}
以上就是关于素数求解的全过程及优化。
相关文章推荐
- 用Beautiful Soup解析html源码
- 02-线性结构1 一元多项式的乘法与加法运算
- Puppet:自动化运维工具!!!
- Puppet:自动化运维工具!!!
- (算法问题)贪吃蛇游戏改编版
- Exchange 2010和Exchange 2016共存部署-2:升级Exchange 2010到SP3 RU12
- 【MFC】:MFC如何实现给按钮加图标背景
- ViewGroup 添加移除View 常用几种方式的区别
- spring配置数据库负载均衡
- hibernate映射详解:一对一映射的两种实现方式
- 音视频基本概念
- win7+iis7+asp+.net+php环境配置
- vijos:P1285佳佳的魔法药水
- STM32 JNTRST JTDI JTDO(PB4 PB3 PA15)引脚用做普通IO方法
- leetcode 56. Merge Intervals
- ping程序的实现
- 第五周学习进度
- Exchange 2010和Exchange 2016共存部署-1:Exchange2010先决条件检查
- Android面试准备 第二天 第五例 数据存储
- jQuery实现图片轮播且鼠标可控制显示,使用animate函数