ACM暴力解题题解(二)

1.1218-XTUOJ

考点:数学公式,素数的判断方法

思路分析:

      审题,题目的意思很明确,求一个数有多少个因子。首先我们用暴力解题,但这里要注意,用for循环,判断给定数值num能整除的数字,其循环的最大值为sqrt(num),当num不是平方数时,每检测到一个数值,count加2,因为检测到一个数字可以被整除,那么必定存在另一个可以被整除的数字,num是平方数,且检测到了sqrt(num)时,count加1。代码提交后,发现超时,那么我们要在原算法的基础上加以修改。该题目用到了如下数学公式:对于任意的整数N,分解质因数得到N= P1^x1 * P2^x2* …… * Pn^xn; 则N的因子个数M为 M=(x1+1) * (x2+1) * …… *(xn+1);注:P1,P2....等都为质数。

      那么有了这个数学公式,我们要怎么下手呢?本着从特殊到一般的思路,6=2X3,6的因子个数N(6)=2X2=4,那么实质上,我们就是要得出每个因子的幂值,2的幂值怎么得?经过分析,只要6整除2一直到不能在整除,那么我们就得出了2的幂值,然后把最后的出数对3进行同样的操作即可。至此我们已经把这个题目解析了一半。

      接下来,还有最后一个问题,对于任意数,我们怎么办?由暴力解题的规律我们可以知道,一个非素数的数,它会有一半的因子在sqrt(num)之前,那么,我们以这个为切入点,利用for循环,在sqrt(num)之前,找到可以整除的因子及其幂,但是我们可以发现这样的算法的时间复杂度好像没有什么变化,那么在此基础上我们还要怎么改进呢?我们发现,其实num的值在算法执行的过程中一直在改变,我们也一直在找num的因子,那么for循环i的上界是不是也应该改变一下呢?我们可以尝试一下。试验后发现,这样的算法对于质数好像不适用,因为num在sqrt(num)之前没有可以除的数,如:7=7,在这种情况下,我们是不是可以判定num剩余到最后的数一定为一个质数呢?

      思考到这里,我们就可以在最后就一个num是否等于1的判断,试验后发现,accepted。

易错:注意数据精度。

扩展:


如何理解,"对于一个自然数n,如果n在sqrt(n)之前没有因子的话,那么在sqrt(n)之后也没有因子"这个规律呢?

解:

设f(x)=n/x,其中n,x均为整数。

如果1<=x<=sqrt(n),则sqrt(n)<=f(x)<=n。

由题目假设可知,当1<=x<=sqrt(n),f(x)均不为整数,证明当sqrt(n)=<x<=n,f(x)均不为整数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值