这个题以后提醒自己,时间超限问题 的优化思路,不要去做过多的遍历
Time Limit Exceeded
第一次因为时间超时提交没有A
第一次的代码:
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
int q(int x)
{
int sum=0;
for(int i=1;i<x;i++){
if(x%i == 0){
sum +=i;
}
}
return sum;
}
int main()
{
int m,n;
cin>>m>>n;
for(int i=m;i<n;i++){
for(int j=i+1;j<n;j++){
if(q(i)==j && q(j)==i){
cout<<i<<" "<<j<<endl;
}
}
}
return 0;
}
这个代码是每次固定一个 q(i) 后,再遍历一遍m~n,找出他的亲密数q(j) 两个for循环导致的算法世家复杂度太高
思考了一下:i 从 m 开始到 n ,每次算出q(i)之后,他如果有亲密数,亲密数的值必==q(i),假设为k,接下来就可以直接看一下q(k)的值是否等于i。注意一下 i j 为不同的数。
优化之后的代码 AC了
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
int q(int x)
{
int sum=0;
for(int i=1;i<x;i++){
if(x%i == 0){
sum +=i;
}
}
return sum;
}
int main()
{
int m,n;
cin>>m>>n;
for(int i=m;i<n;i++){
int k = q(i);
if(q(k)==i&&i<k){
cout<<i<<" "<<k<<endl;
}
}
return 0;
}