二分法
本题思路:先找到n 位于哪两个长度之间(用二分法)
然后可求解
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; const int maxn=66100; #define INT_MAX 2147483600 int a[maxn],k; int init() { int i; a[0] = 0; for(i = 1; ; i++){ if(a[i - 1] >= INT_MAX - i)//如果i-1时 总数超过intmax break break; a[i] = a[i - 1] + i; } a[i] = INT_MAX; return k = i + 1;// 标记最后的一个串的位置 } int bin_search(int key) { int head = 1; int tail = k; while(head <= tail) { int mid = (head + tail) / 2; if(a[mid] <= key && a[mid + 1] > key) return mid; else if(a[mid] > key) { tail = mid - 1; } else head = mid + 1; } return k; } int main() { int k; cin >> k; init(); while(k--) { int n; cin >> n; int t = bin_search(n); int ans = n - a[t]; if(ans == 0) ans = a[t] - a[t - 1]; if(ans % 9 == 0) cout << 9 << endl; else cout << ans % 9 << endl; } return 0; }