先把题目弄过来:
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.
InputInput 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).
OutputWrite a line in output for each number of given sequence. Write Yes if given number is nearly prime and No in other case.
Sample Input1 6Sample Output
Yes
我想的方法就是把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,后面的就超时了,找了半天找出的错误。
短接原理,简单改变一下位置,将耗时少的放在前面,就可以大幅提升程序的效率。
或许再简单不过的一道题,看的出深深的差距。
不禁有些迷茫,自己真的没有天赋,没有那种思维。
没事,好歹还是学到知识了。
特么的要坚持啊!