航电oj1262(寻找素数组)的Time Limit Exceeded问题
代码1:
using namespace std;
#include<iostream>
bool prime(int n)
{
for(int i=2;i<n;i++)
{
if(n%i==0)
{
return false;
break;
}
if(i == n-1)
{
return true;
}
}
}
int main(){
int M,minp1,minp2,distance,l;
while(cin>>M)
{
distance = M;
for(int i=1;i<=M/2;i++)
{
if(prime(i))
{
for(int j=i;j<M;j++)
if(prime(j))
{ l=j-i;
if(distance>l&&i+j == M)
{
minp1 = i;
minp2 = j;
distance = l;
}
}
}
}
cout<<minp1<<" "<<minp2<<endl;
}
}
这里我是根据选择排序的原理,遍历了所有1-M的数据组合一遍找出距离最小的组合,一旦数据过大,如输入9998,就会出现Time Limit Exceeded的报错,原因是这个代码的效率极低,运行需要的时间很长。
代码2(AC代码):
using namespace std;
#include<iostream>
bool prime(int n)
{
for(int i=2;i<n;i++)
{
if(n%i==0)
{
return false;
break;
}
if(i == n-1)
{
return true;
}
}
}
int main()
{
int M;
while(cin>>M)
{
int minp1=M/2,minp2=M/2;
while(1)
{
if(prime(M/2))
{
break;
}
else
{
minp1--;
minp2++;
}
if(prime(minp1)&&prime(minp2))
break;
}
cout<<minp1<<" "<<minp2<<endl;
}
}
代码2这里我运用了中间值向外发散,minp1与minp2每次变化1,只要它俩儿都是素数,则加起来一定等于M;而且距离最短。代码2效率显然比代码1 的效率要高的多,因为它不用遍历完1-M 的所有素数组合,因此不会出现Time Limit Exceeded的问题。
TLE了好久,差点人都傻了- -