这道题,虽然很水。但是给我的感触非常深刻,因为一个小小的优化。速度快了很多。
先贴出代码。对比一下就可以知道了。
优化前的代码,耗时46ms
#include<iostream>
#include<string>
using namespace std;
int main()
{
int test;
cin>>test;
while(test--)
{
int a,b,ans1,ans2;
cin>>a>>b;
ans1=1;ans2=1;
for(int i=2;i<=a/2;i++)
{
if(a%i==0)
ans1=ans1+i;
}
for( i=2;i<=b/2;i++)
{
if(b%i==0)
ans2=ans2+i;
}
if(ans1==b&&ans2==a)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
接下来的是优化后的代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
int test;
cin>>test;
while(test--)
{
int a,b,ans1,ans2;
cin>>a>>b;
ans1=1;ans2=1;
int tmp=a/2;
for(int i=2;i<tmp;i++)
{
if(a%i==0)
{
ans1=ans1+i+a/i;
continue;
}
else
{
tmp=a/(i+1);
}
}
tmp=b/2;
for( i=2;i<tmp;i++)
{
if(b%i==0)
{
ans2=ans2+i+b/i;
continue;
}
else
{
tmp=b/(i+1);
}
}
if(ans1==b&&ans2==a)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
可以看出
int tmp=a/2;
for(int i=2;i<tmp;i++)
{
if(a%i==0)
{
ans1=ans1+i+a/i;
continue;
}
else
{
tmp=a/(i+1);
}
}
这几句起了决定性的作用,而且每次减少的数据量,都是非常可观的
由于不会编辑数学公式,我就不详细写出来了。
原理就是:if
if(a%i==0)
显然 a%(a%i)必然等于0.所以可以加上
else
i+1,tmp=a/(i+1)
这样,循环数就可以减少很多了。