我本来想的办法,是结合深度,算法时间复杂度太大,不通过。
看到这位大神的算法,让我醍醐灌顶,多么简洁高效!
#include<bits/stdc++.h>
using namespace std;
int main(){
int x,y;
while(scanf("%d %d",&x,&y)!=EOF){
while(x!=y){
if(x<y){
y = y>>1;
}
else{
x = x>>1;
}
}
printf("%d\n",x);
}
}
不好的代码展示:
#include<bits/stdc++.h>
using namespace std;
int pow(int a,int b){
int ans = 1;
while(b!=0){
if(b&1==1){
ans = ans*a;
}
b = b>>1;
a = a*a;
}
return ans;
}
int main(){
int x,y;
while(scanf("%d %d",&x,&y)!=EOF){
int h1=0,h2=0;
while(1){
if(pow(2,h1)<=x&&x<=pow(2,h1+1)-1){
break;
}
else{
h1++;
}
}
while(1){
if(pow(2,h2)<=y&&y<=pow(2,h2+1)-1){
break;
}
else{
h2++;
}
}
while(h1!=h2){
if(h1<h2){
y = y/2;
h2--;
}
else if(h1>h2){
x = x/2;
h1--;
}
}
while(h1==h2){
if(x==1||y==1){
printf("1\n");
break;
}
else if(x/2==y/2){
printf("%d\n",x/2);
break;
}
else{
y = y/2;
h2--;
x = x/2;
h1--;
}
}
}
return 0;
}