题目
NOIP2012-普及组T1-质因数分解 |
---|
难度级别:A; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
试题描述 |
已知正整数 n n n 是两个不同的质数的乘积,试求出较大的那个质数。 |
输入 |
输入只有一行,包含一个正整数n。 |
输出 |
输出只有一行,包含一个正整数p,即较大的那个质数。 |
输入示例 |
21 |
输出示例 |
7 |
题解
思路
这道题很简单,题目怎么说我们就怎么做。
既然 n n n 是两个不相同质数的乘积,那么我们就枚举每一个质数,然后再判断 i i i 是否整除 n n n ,然后再判断 n / i n/i n/i 是否为质数即可。
然而…
这道题真的有这么复杂(指操作步骤)吗?
想必聪明的读者早已发现题目中的端倪,发现题目的本质了。(博主当时并没有想到qwq)
我们在此一一分析。
①这个质数从哪里枚举好呢?题目要求输出较大的那个质数,我们真的要从 n n n 枚举到 2 2 2 吗?
并不需要,可以感受出来,一个数的约数个数是围绕着 n \sqrt{n} n 左右对称的(其实是博主数学功底不扎实,不会证明),而 1 1 1 到 n \sqrt{n} n 的范围显然比 n \sqrt{n} n 到 n n n 的范围要小,因此我们只需要从 1 1 1 枚举到 n \sqrt{n} n 即可。
②需不需要判断 n / i n/i n/i 是质数?
其实连 i i i 是否为质数都不需要判断!
n n n 是由两个质数相乘得到的,因此 n n n 的第一个合数约数,就是它本身,抛去 1 1 1, n n n的剩下的约数只有那两个质数
//被抛弃的证明过程
完整代码
经过了以上分析,我们可以得到了最终的代码
#include<bits/stdc++.h>
int main()
{
int n,i;
scanf("%d",&n);
for(i=2;i<n;i++)
{
if(n%i==0)
{
printf("%d",n/i);
break;
}
}
return 0;
}
写在后面
这道题简单归简单,但是如果质数判断次数又多,效率又低的话,还是有可能TLE的。
然而仔细读题并思考,我们会发现这题也就这回事,甚至连质数判断都不需要。
这道题告诫我们:
①仔细读题,认真思考,再开始写代码
②数学基础不能落下啊…