二分法

本题思路:先找到n 位于哪两个长度之间(用二分法)

然后可求解

#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;
}
View Code

 

posted @ 2016-08-10 10:42  曹某某的博客  阅读(99)  评论(0编辑  收藏  举报