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<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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值