关闭

XTU 1227 Digit

148人阅读 评论(0) 收藏 举报
分类:

题目描述

我们把十进制整数依次写成一个字符串,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<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdio>
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;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:30276次
    • 积分:1586
    • 等级:
    • 排名:千里之外
    • 原创:131篇
    • 转载:5篇
    • 译文:0篇
    • 评论:5条
    博客专栏
    最新评论