poj 1019

来源:互联网 发布:传智播客软件测试 编辑:程序博客网 时间:2024/05/12 15:56

 参照http://www.slyar.com/blog/poj-1019-cpp.html

题目大意:就是求一个数字序列的第n位的数字是多少。这个序列a1a2a3.....an

a1=1, a2=12, a3=123, ......an=1234567891011......n

len[i]表示1----i的长度

s[i]表示a1a2a3...ai的长度

log10(i) + 1表示i的位数

len[i] = le[i-1] + log10(i) + 1

s[i] = s[i-1] + len[i]

 

输入的n先求出在第k段的第几个数n - s[i-1],然后再求出n是这个数的第几位

#include <iostream>#include <cstdio>#include <cmath>using namespace std;const int maxn = 31270;int t, n;unsigned len[maxn], s[maxn];void preprocess();int main(){       int i, pos, length, val;    len[1] = 1;    s[1] = 1;    for(i = 2; i < maxn; i++)    {        len[i] = len[i-1] + (unsigned int) log10((double)i) + 1;        s[i] = s[i-1] + len[i];    }        scanf("%d", &t);    while(t-- != 0)    {        length = 0;        scanf("%d", &n);        for(i = 1; s[i] < n; i++);                pos = n - s[i-1];        i = 1;        while(length < pos)        {            length += (int)log10((double)i) + 1;            i++;        }                    val = ((i - 1) / (int) pow((double)10, length - pos)) % 10;        printf("%d\n", val);    }       return 0;}


 

原创粉丝点击