CSP_[NOIP2012普及组]_质因数分解

题目描述

已知正整数 𝑛是两个不同的质数的乘积,试求出两者中较大的那个质数。

输入格式

输入一个正整数 𝑛。

输出格式

输出一个正整数 p,即较大的那个质数。

输入样例

21

输出样例

7

说明/提示

【数据范围】

1≤n≤2×10^9

题目分析

质数:只有两个正因数(1和它本身)的自然数即为质数。

合数:比1大但不是质数的数称为合数。

10既非质数也非合数。

求质数的方法:

  • 试除法

给定的整数n,除以1<i<n的数,如果都不能整除,则n为质数。

  • 试除法优化

对于所有的整数,因数时成对出现的a*b=n,当a,b无限接近时a<= sqrt(n)

因此,枚举范围可以缩小至2~sqrt(n)

  • 埃氏筛法

对多个整数进行质数判断时,算法更优。假设多个整数中的最大值为20,算法实现过程:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

2

2

3

-

5

-

7

-

9

-

11

-

13

-

15

-

17

-

19

-

3

2

3

-

5

-

7

-

-

-

11

-

13

-

-

-

17

-

19

-

5

2

3

-

5

-

7

-

-

-

11

-

13

-

-

-

17

-

19

-

7

2

3

-

5

-

7

-

-

-

11

-

13

-

-

-

17

-

19

-

  1. 遍历2~20所有整数数组a[i] (2<=i<=20),默认值a[i]=1;
  2. 最小整数i=2是质数,所有2的倍数均为不是质数,都划掉a[i]=0
  3. i=3,如果a[3]=1,所有3的倍数均不是质数,都划掉a[i]=1
  4. i=4,因为a[4]=04不是质数,继续下一个
  5. i=5,以为a[5]=1,所有5的倍数均不是质数,都划掉a[i]=1;
  6. 最后,剩余的a[i]=0的数,均为质数。
  • 欧拉筛法

欧拉筛法原理同埃氏筛法,区别是埃氏筛法中一个合适可能会被筛多次,如9可以被2筛去也可以被3筛去,而欧拉筛法只让一个合数被筛选一次。

本题只筛选一个整数n,使用优化后的试除法就可以了。

代码实现

#include <bits/stdc++.h>
using namespace std;
int n;
int main(){
	cin >> n;
	for(int i=2;i<=sqrt(n);i++)
	{
		if (n%i==0)
		{
			cout << (n/i);
			break;
		}
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值