#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老师,老师也没给出明确解答,老师说可能还是二分查找的逻辑不对。可能也是,在二分查找的边界区间上自己并不是搞得很明朗清楚