Digit【2015 湘潭大学程序设计比赛(Internet)】

来源:互联网 发布:淘宝怎么有付费流量 编辑:程序博客网 时间:2024/05/15 07:04

Click to view the problem

思路:这道题我就是直接算,给定的字符串是从1开始的,可以确定有9个一位数,90个两位数,900个三位数,9000个四位数…….so,计算一下所给的n包含的有几位数,并计算出最后一个数。具体步骤看代码。。。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int main(){    __int64 t, n, k;    __int64 sum, l;    //没用长整形会爆掉    __int64 x, pp, i;    int ans, a[10];    scanf("%I64d", &t);    while(t--)    {        scanf("%I64d", &n);        for(i = 9,k = 1; ; i = i * 10)        {            sum = i * k;            if(n <= sum) break;            k++;      //计算出数字位数            n -= sum;        }        if(n / k == 0)            x = i / 9;               else                                x = (n/k) + i / 9 - 1;      //计算出第n位所在的那个数        if(n % k == 0) ans = x % 10;    //如果能整除,证明是数的最后一位        else     //将        {            pp = (n % k) - 1;   //所求的数字的位数            i = k - 1;            if(n % k != 0)                x++;            while(1)      //将x拆开存到数组            {                if(x == 0)                    break;                a[i] = x % 10;                x /= 10;                i--;            }            ans = a[pp];        }        printf("%d\n", ans);    }    return 0;}
0 0
原创粉丝点击