NOIP2012 - 普及组T1 - 质因数分解

题目

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的。

然而仔细读题并思考,我们会发现这题也就这回事,甚至连质数判断都不需要。

这道题告诫我们:

①仔细读题,认真思考,再开始写代码

②数学基础不能落下啊…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值