zj讲了半天,我什么都没听懂,我只是想自己看看我就能明白吧,我?哈哈哈,高数作业还没写,算法课要不要上
http://blog.csdn.net/wang2332/article/details/79373271
**题意有点重要,其实也就是从2到p这些数字,按倍数往后算吧,直到跳不到,界限 是y
那么也就是说有个素数的话,肯定大于素数,因为素数是肯定满足题意的,那个跳不到的点如果由于p的原因并不是素数的话,也肯定是在素数的后面,因为素数已经是极限情况了.
#include<iostream>
using namespace std;
//那我们,怎么想呢.
int p, y;
bool ornot(int x)
{//判断这个数是否满足条件
//*****用&&的话,只要有一个是假的就要返回假的
//这里用max写也可以
//当数据量特别大的时候,针对一个...针对一个数据吧如果他坚持是素数你还继续往后面算
找素数,请记住,i*i<=x
for (int i = 2; i*i<=x&&i <= p; i++)//其实还是少了
{
if (x%i == 0)//饿,这个,很大很大的x,被分配了,所以不参加,
return false;
}
// return false;
return true;//如果他最后也没能够分配,那就是他了
}
//另外再注意两点...一个是,p是可以到达所以上面是i=2到i=p
//以及,下面要一直减小减小到j>p算作是条件吧
//对于大数据我们当然无可奈何.. 但是小数据比如 3 4 这个还是要卡死的
//然后按照题意来就是那个树枝还是已经被占领了的.. 所以这里p不能等于
int main()
{
//int p, y;
cin >> p >> y;
for (int j = y;j>p; j--)
{
if (ornot(j))
{
cout << j << endl;
return 0;//break;
}
}cout << "-1" << endl;
//如果到了
return 0;
}
别人的...
//我不理你了,随便你吧
//0309
#include<iostream>
using namespace std;
#define CLR(a,b) memset(a,(b),sizeof(a))
#define LL long long
const int MAXN = 1e3 + 10;
const double eps = 1e-15;
int p, y;
bool prime(int x)
{//也就是x>=sqrt i 就是计算从2到后面吧,从i到p,max也可以,这个&&哪个成立都可以
for (int i = 2; i*i <= x && i <= p; i++) {
if (x%i == 0)//i++,如果x%i==0也就是可以除得尽,就跑了好了,
//如果一直循环完了都不行的话,...你就去死吧... 所以嗯
return false;
}
return true;
}
int main()
{
cin >> p >> y;//i是,从2到p的一个范围
//然而他却,倒着从后面往前寻找
//如果寻找的过程中,在2到p里面并不能达到这个数字,就输出好了
for (int i = y; i > p; i--) {
if (prime(i)) {
cout << i << endl; return 0;
}
}
cout << -1 << endl;
return 0;
}
最后时间上卡的是...i<sqrt(x),还是p那个.....
差距很多吗?
很多!!!!!!!如果p很大很大,有1e8,那么你每一次都要1e8 个循环....
然后这一次这么多就快要超时了..
但是这个i*i<=x,x=1e8时,也只要花费根号x的时间就好了
!!!这可是关键啊