poj1019 n的位数+规律

来源:互联网 发布:mac 更改ruby路径 编辑:程序博客网 时间:2024/06/05 09:31

题目链接:http://poj.org/problem?id=1019


题目大意:给你一个串112123123412345……问第n位的数字是多少。n<int

思路:首先我们分析这个字符串可以看出它是由这些子串组成的,1,12,123,1234,12345......
这样我们可以每个子串单独分析,我们可以看出来第i个子串比第i-1个子串多一个数i,数字i的长度为log10(i)+1,也就是是说第i个子串比第i-1个子串的长度长log10(i)+1,这样通过递推我们可以求出来每个子串的长度,直接用n减就可以,当n小于0说明第n位就在这个串里面,然后再对该串的每一个数字的位数相减,最后可以判定n在哪个数字中,分解一下就好了


#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <fstream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <iomanip>using namespace std;//#pragma comment(linker, "/STACK:102400000,102400000")#define maxn 100050#define MOD 1000000007#define p 1000000007#define mem(a , b) memset(a , b , sizeof(a))#define LL long long#define ULL unsigned long long#define FOR(i , n) for(int i = 1 ;  i<= n ; i ++)typedef pair<int , int> pii;const long long INF= 0x3fffffff;int n , m , t;int num[maxn];void init(){    num[0] = 0;    num[1] = 1;    for(int i = 2 ; i < maxn ; i ++)    {        num[i] = (num[i-1] + log10(i) + 1);    }}int main(){    init();    scanf("%d" , &t);    while(t--)    {        scanf("%d" , &n);        int i = 1;        while(n > 0)        {            n -= num[i++];        }        i--;        if(n == 0)        {            printf("%d\n" , i % 10);            continue;        }        n += num[i];      //  cout << n << endl;        int tmp = n;        for(i = 1 ; i <= tmp ; i ++)        {            n -= (int)(log10(i) + 1);            if(n <= 0) break;        }       // cout << n << endl;        if(n == 0)        {            printf("%d\n" , i % 10);            continue;        }        n += (log10(i) + 1);      //  cout << n << " " << i << endl;        int ans[15];        int id = 0 ; tmp = i;        while(tmp > 0)        {            ans[id++] = tmp % 10;            tmp /= 10;        }        cout << ans[id-n] << endl;    }    return 0;}


有一个字符串的形

有一个字符串的形式是这样的112123123412345123456123456712345678123456789123456789101234567891011123456789101112..........

现在要求你写出他的第n位上的数字是什么,注意是数字而不是数.

1 ≤n ≤ 2147483647。(POJ1019)

有一个字符串的形式是这样的112123123412345123456123456712345678123456789123456789101234567891011123456789101112..........

现在要求你写出他的第n位上的数字是什么,注意是数字而不是数.

1 ≤n ≤ 2147483647。(POJ1019)

有一个字符串的形式是这样的112123123412345123456123456712345678123456789123456789101234567891011123456789101112..........

现在要求你写出他的第n位上的数字是什么,注意是数字而不是数.

1 ≤n ≤ 2147483647。(POJ1019)

有一个字符串的形式是这样的112123123412345123456123456712345678123456789123456789101234567891011123456789101112..........

现在要求你写出他的第n位上的数字是什么,注意是数字而不是数.

1 ≤n ≤ 2147483647。(POJ1019)

式是这样的112123123412345123456123456712345678123456789123456789101234567891011123456789101112..........

现在要求你写出他的第n位上的数字是什么,注意是数字而不是数.

1 ≤n ≤ 2147483647。(POJ1019)

有一个字符串的形式是这样的112123123412345123456123456712345678123456789123456789101234567891011123456789101112..........

现在要求你写出他的第n位上的数字是什么,注意是数字而不是数.

1 ≤n ≤ 2147483647。(POJ1019)

有一个字符串的形式是这样的112123123412345123456123456712345678123456789123456789101234567891011123456789101112..........

现在要求你写出他的第n位上的数字是什么,注意是数字而不是数.

1 ≤n ≤ 2147483647。(POJ1019)

有一个字符串的形式是这样的112123123412345123456123456712345678123456789123456789101234567891011123456789101112..........

现在要求你写出他的第n位上的数字是什么,注意是数字而不是数.

1 ≤n ≤ 2147483647。(POJ1019)

有一个字符串的形式是这样的112123123412345123456123456712345678123456789123456789101234567891011123456789101112..........

现在要求你写出他的第n位上的数字是什么,注意是数字而不是数.

1 ≤n ≤ 2147483647。(POJ1019)

0 0
原创粉丝点击