找找规律,实际上是二分查找的过程,只要找到了mid与输入的n相同的话,直接输出left和right就可以了。
代码如下:
1 #include <iostream> 2 using namespace std; 3 4 long long getroot(int n) 5 { 6 long long root = 2; 7 while(root*2 <= n) 8 root *= 2; 9 return root; 10 } 11 12 int main() 13 { 14 int T; 15 cin>>T; 16 while(T --) 17 { 18 long long n,root; 19 cin>>n; 20 root = getroot(n); 21 long long left = 1 , right = 2*root - 1; 22 long long mid = (left + right)/2; 23 while(mid != n) 24 { 25 if(mid > n) right = mid - 1; 26 if(mid < n) left = mid + 1; 27 mid = (right + left)/2; 28 } 29 30 cout<<left<<" "<<right<<endl; 31 32 } 33 return 0; 34 }