HDU 1597的调试,为什么不能直接退出while,还要执行几次下面的if

#include <cstdlib>
#include <iostream>

using namespace std;

long long tmp[70000]; //存下到目前数组下标位置存下的数位的数量

long long n;
long long tmp2;
int flag;
void my_search(int l, int r)
{
     int m;

     m = (l + r) / 2;
     while(flag){
     if (tmp[m] < n && tmp[m + 1] >= n) //找出前面子串的数位和
     {
       tmp2 = m;
       flag=0;
     }


     if (tmp[m] >= n)
        my_search(l, m - 1);
     if (tmp[m + 1] < n)
        my_search(m + 1, r);
}
}
int main()
{

    int i;
    int T;
    int ans;
    for (i = 1; i <= 100; i++)
      tmp[i] = tmp[i - 1] + i;
//    cout << tmp[65536] << endl;
    cin >> T;
    while (T--)
    {
      flag=1;
      cin >> n;
      tmp2 = -1;
      my_search(1, 20);
      ans = n - tmp[tmp2]; //减去前面完整的数位子串,得到最后所在的子串的位置,这里的位置即对应数字
      ans = ans % 9;
      if (ans == 0) ans = 9;
      cout << ans << endl;
    }
   return 0;
}

在单步调试中,为什么不能直接退出while,还要执行几次下面的if,提交也是超时


问了UML老师,老师也没给出明确解答,老师说可能还是二分查找的逻辑不对。可能也是,在二分查找的边界区间上自己并不是搞得很明朗清楚

原文地址:https://www.cnblogs.com/mingrigongchang/p/6246292.html