hoj 1015 NearlyPrimerNumber 的思考

先把题目弄过来:

Nearly prime number is an integer positive number for which it is possible to find such primes P1 and P2 that given number is equal to P1*P2. There is given a sequence on N integer positive numbers, you are to write a program that prints Yes if given number is nearly prime and No otherwise.

Input

Input consists of N+1 numbers. First is positive integer N (1<=N<=50000). Next N numbers followed by N. Each number is not greater than 109. All numbers separated by whitespace(s).

Output

Write a line in output for each number of given sequence. Write Yes if given number is nearly prime and No in other case.

Sample Input
1
6
Sample Output
Yes

我就不说开始我拿手机看10^9看成109了。

我想的方法就是把10^9内的素数全部求出然后挨个乘看是否等于的输入的数。唉,太傻太天真了。

网上找到的代码:

bool isNPN(int n)
{
    int m = (int)sqrt((double)n) + 1;

    if (n%2==0 && isPrime(n/2))
    {
        return true;
    }
    for (int i=3; i<m; i+=2)
    {
        if (n%i == 0 && isPrime(i))
        {
            if (isPrime(n/i))
            {
                return true;
            }
        }
    }
    return false;
}

关于为什么要开方,我实在有些不太清楚,就像为什么判素要开方一样。

不过除以一个素数然后看商是否是素数这个方法还是深深的震撼了我,!!不就是我们平时的思维吗!!!我不禁深深的疑惑了。额。

其次就是首先判断2以及后面+=2还是有很高的效率的,再次感慨。

最后要说的就是里面的一句代码:

if (n%i == 0 && isPrime(i))
我写的时候是

if (isPrime(i)&&n%i == 0)
然而前面的AC,后面的就超时了,找了半天找出的错误。

短接原理,简单改变一下位置,将耗时少的放在前面,就可以大幅提升程序的效率。

或许再简单不过的一道题,看的出深深的差距。

不禁有些迷茫,自己真的没有天赋,没有那种思维。

没事,好歹还是学到知识了。

特么的要坚持啊!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值