XTU 1227 Digit

题目描述

我们把十进制整数依次写成一个字符串,123456789101112…请问第n位数码是多少?
输入

第一行是一个整数T(T≤10000),表示样例的个数。 每行输入一个整数n(1≤n≤788888899)。
输出

每行输出一个样例的结果。
样例输入

2
1
788888899

样例输出

1
1
最近在湘大oj上刷题,为湘大比赛做准备。感觉有点坑,题目不同的提交方式,竟然结果不同,无语了,然后花大量的时间找BUG,无语了!
分析:这一题直接做的暴力,估计会GG,数据有点大。所以我先对1,到9位的数所占的位数都算出来了,比如一位数有 1,2,3,4,5,6,7,8,9 : 2位数有 10 到99 :3位数有100到999。然后具体求输入n所对应的数,并求它的位。.

#include
#include
#include
#include
#include
#include
using namespace std;
__int64  s[10000];
char st[2000];
int main()
{
    s[0]=0,s[1]=9 ;
    __int64 x=9 , y=1;
     for(int i=2; i<=9 ;i++)
     {
        x=x*10+9 ,y*=10;
        s[i]=(x-y+1)*i;
     }

     for(int i=2; i<=9 ;i++)//前n位数之和
     {
        s[i]+=s[i-1];
     }
     int t;
     scanf("%d",&t);
     while(t--)
     {
        __int64  b;
        scanf("%I64d",&b);
        int k,flag=0;
        for(int i=1;i<=9;i++)
        {
            if(s[i]>b) //找到在几位数之间 
            {
                k=i;//k代表 n是几位数
                break;
            }
             if(s[i]==b)//位全是9的情况
            {
                flag=1;
                printf("9\n");
                break;
            }
        }
        if(flag)
        continue;
         __int64 sum;
        sum=b-s[k-1];
        __int64   sum1=sum/k,sum2=sum%k;//sum1 cong 9999…………(k-1个9)扩展sum个位,也就是+sum1,sum2用来处理扩展为不是K整数情况。
        if(sum2!=0)
        {
                k--;
              __int64  n=pow(10,k*1.0);
            n+=sum1;
            sprintf(st,"%I64d",n);
            printf("%c\n",st[sum2-1]);
        }
        else
        {
            k--;
            __int64  n=pow(10,k*1.0);
            n+=(sum1-1);
            sprintf(st,"%I64d",n);
            printf("%c\n",st[k]);
        }
     }
    return 0;
}

你可能感兴趣的:(规律)