| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
两次二分贴代码#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX 35000
unsigned group[MAX+1] = {0}, sumGroup[MAX+1] = {0};
inline unsigned getGroupLength(unsigned k)
{
if(k <= 9) return k;
if(k <= 99) return k + (k-9);
if(k <= 999) return k + (99-9) + 2*(k-99);
if(k <= 9999) return k + (99-9) + 2*(999-99) + 3*(k-999);
return k + (99-9) + 2*(999-99) + 3*(9999-999) + 4*(k-9999);
}
void init()
{
for(unsigned i = 1; i <= MAX; ++i){
group[i] = getGroupLength(i);
sumGroup[i] = sumGroup[i-1] + group[i];
}
}
char getDigit(unsigned n)
{
char num[12];
//get which group the nth digit is in
unsigned k = lower_bound(sumGroup, sumGroup+MAX+1, n) - sumGroup;
// printf("the %uth digit is in the %uth group\n", n, k);
//get which position the nth digit is in the kth group
n -= sumGroup[k-1];
//get which number the nth digit is in the kth group
k = lower_bound(group, group+MAX+1, n) - group;
//get the number in string
sprintf(num, "%u", k);
//get the digit
return num[n-group[k-1]-1];
}
int main()
{
init();
unsigned t, n;
for(scanf("%u", &t); t--; ){
scanf("%u", &n);
putchar(getDigit(n));
putchar('\n');
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator