求小于N的所有素数(三种方法)

方法一:遍历法

对2到输入的数值n之间的所有整数进行循环遍历(由于1不是素数,故从2开始遍历)在内循环判断该循环整数是否为素数,判断条件是该整数能否被2和该整数减1之间的数整除,在一层循环内二层循环外设置flag变量为1,若在判断中满足条件,flag置0,跳出二层循环后判断flag是否仍为1,若是,说明该整数不能被整除,为素数,输出值,反之无法被输出。

最后用clock函数计算运行时间

算法时间复杂度:O(n^2)

(另外这个算法可以做优化,将第二层循环的终止条件改为i/2或者sqrt(i),减少循环次数提高效率)

//方法一:
int main()
{

	int n;
	cout << "请输入N:";
	cin >> n;
	clock_t t1, t2;
	t1 = clock();
	for (int i = n-1; i >1; i--)
	{
		//判断是否为素数
		int flag = 1;
		for (int j = 2; j < i ;j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
				
		}
		if (flag == 1)//或者if(i==j)
			cout << i << " ";
	}
	t2 = clock();
	cout << endl<<"运行时间是:"<<((double)(t2 - t1)) / CLK_TCK <<"秒" << endl;
	return 0;
}

 

方法二:排除法

创建一个变长数组,将2到输入的数字N全部输入到数组内,并从2到N遍历,从2开始数字的整数倍都置0,直到超过N循环结束,遍历结束后输出不为0的数组值,即为小于N的所有素数,并计算运行时间。

算法时间复杂度:O(n^2),实际上是O(n^2/+n)

//方法二:
int main()
{

	
	int N;
	cout << "请输入N:";
    cin >> N;
    clock_t t1, t2;
	t1 = clock();
    int arr[N];
	for (int i = 2; i < N; i++)
	{
		arr[i] = i;
	}
	for (int i = 2; i < N; i++)
	{
		if (arr[i] != 0)
		{
			for (int j = 2 * i; j < N; j += i)
			{
				arr[j] = 0;
			}
		}
	}
	for (int i = 1; i < N; i++)
	{
		if(arr[i])
		cout << arr[i] << " ";
	}
	t2 = clock();
    cout << endl << "运行时间是:" << ((double)(t2 - t1)) / CLK_TCK << "秒" << endl; 
	return 0;
}

方法三:优化法

和方法一类似,但做了很多优化,由于除了2之外的所有素数都是奇数,因此在第一层循环中可以遍历奇数,并且所有数因式分解成任何两项相乘的形式,总有一项小于等于该数取平方根的数,因此只要排查3到该数取平方根的数范围即可判断是否为素数。并计算运行时间。

算法时间复杂度:O(n*√n)

//方法三:
int main()
{
	int n;
 	cout << "请输入N:";
	cin >> n;
    clock_t t1, t2;
	t1 = clock();
	cout << "2 ";//2本身就是素数,且是所有素数中唯一的偶数
	for (int i = 3; i < n; i += 2)
	{
		int flag = 1;
		for (int j = 2; j * j <=i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)//或者if(j * j >i)
		{
			cout << i << " ";
		}
	}
	t2 = clock();
	cout << endl << "运行时间是:" << ((double)(t2 - t1)) / CLK_TCK << "秒" << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值