一步一步写算法(之素数问题)

问题描述

素数就是指在一个大于1的自然数中,仅能被1和它自身整除的整数。判定一个整数n是否为素数就是要判定整数n能否被除1和它自身之外的任意整数整除,若都不能整除,则n为素数。

这个算法实现起来很简单,主要目的是为了体会算法时间复杂度,要时刻注意优化算法,这在实际应用中非常重要。

问题解析

接口设计:判断一个整数(参数)是否为素数(质数),如果是质数,则返回1,否则返回0。

方法1:根据概念判断。判定一个整数n是否为素数就是要判定整数n能否被除1和它自身之外的任意整数整除,若都不能整除,则n为素数。时间复杂度O(n)。

int  IsPrimeNumber(int n)
{
	int j;

	if( n<2 )
	{
		return 0;
	}
	for(j=2;j<n;j++)
	{
		if(n%j==0)
		{
			break;
		}
	}
	if(j==n)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

方法2:减小问题规模。判定一个整数n是否为素数,除了2以外的偶数肯定不是素数,因此可以跳过,只需判断奇数是否为素数。这样,判断素数的外循环次数可以减少1/2。时间复杂度O(n/2), 速度提高一倍。

int  IsPrimeNumber(int n)
{
	int j;
	if( n<2 )
	{
		return 0;
	}
	//验证偶数
	if( n==2 )
	{
		return 1;
	}
	else if( n%2==0 )
	{
		return 0;
	}
	//验证奇数
	for(j=3;j<n;j+=2)
	{
		if(n%j==0)
		{
			break;
		}
	}
	if(j==n)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

方法3:减小问题规模。判定一个整数n是否为素数,不需要用偶数去测试,而且不需要测试到n,只需要测试到n的平方根就可以了,这样内循环的次数又进一步减少了。时间复杂度O(sqrt(n)/2), 速度提高O((n-sqrt(n))/2)。

int  IsPrimeNumber(int n)
{
	int j;
	if( n<2 )
	{
		return 0;
	}

	//验证偶数,第一种形式
	if( n==2 )
	{
		return 1;
	}
	else if( n%2==0 )
	{
		return 0;
	}

	//验证偶数,第二种形式
/*	if( n%2==0 )
	{
		if(n==2)
		{
			return 1;
		}
		return 0;
	}*/

	//验证奇数,第一种形式
/*	int k=int(sqrt(double(n)));
	for(j=3;j<=k;j+=2)
	{
		if(n%j==0)
		{
			break;
		}
	}
	if(j>k)
	{
		return 1;
	}
	else
	{
		return 0;
	}*/

	//验证奇数,第二种形式
/*	for(j=3;j*j<=n;j+=2)
	{
		if(n%j==0)
		{
			break;
		}
	}
	if(j*j>n)
	{
		return 1;
	}
	else
	{
		return 0;
	}*/

	//验证奇数,第三种形式
	for(j=3;j*j<=n;j+=2)
	{
		if(n%j==0)
		{
			return 0;
		}
	}
	return 1;
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值