• Digit


    Digit

    Accepted : 85   Submit : 308
    Time Limit : 1000 MS   Memory Limit : 65536 KB 

    题目描述

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

    输入

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

    输出

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

    样例输入

    2
    1
    788888899
    
    

    样例输出

    1
    1
    


    理解不了什么意思,先存着= =||

    理解之后回来看看^_^

    #include <cstdio>
    #include <cstring>
    #include <math.h>
    #include <iostream>
    #include <algorithm>

    using namespace std;

    __int64 num[15]={0,9,99,999,9999,99999,999999,9999999,99999999,999999999,9999999999}; // 几位数,临界值
    __int64 sum[15]; //几位数之前有多少数

    int main ()
    {
        int i, t;
        int n, m, Sum;
        sum[0] = 0;
        for (i=1; i<11; i++)
            sum[i] = sum[i-1] + (num[i]-num[i-1])*i; // 这个数是一个i位数,之前有多少数。2位数之前有9位数,3位数开始之前有189个位
        scanf ("%d", &t);
        while (t --)
        {
            scanf ("%d", &n);
            i = 1;
            while (n > sum[i])
                i ++; // n 这个数是在一个i位数中间的一个数

            n -= sum[i-1]; //n变成了 这个i位数开始之后的n位数
    n = n % i;  // n是这个i位数中的第n位
            Sum = num[i-1] + n / i; // num【i-1】是这个i位数开始之前的数,n/i是指第几个i位数,n是在Sum中的某一位
            m = (num[i] - num[i-1])/9; //几位数,m后就有几个零
           
            int s; //存结果
            if (n == 0)
                s = Sum % 10; // n等于0表示是这个数的最后一位
            else
            {
                Sum ++; // n大于0表示已经超过i位了,所以要加一,就是第n位在Sum+1这个数里边
                while (n --)
                {
                    s = (Sum / m) % 10; // 求第n位是多少
                    m /= 10;
                }
            }
            printf ("%d ", s);
        }
        return 0;
    }

    Do you understand?^_^||
    让未来到来 让过去过去
  • 相关阅读:
    概率统计(DP)
    iOS中几种定时器
    微信开发笔记——微信网页登录授权,获取用户信息
    swift中通知的使用
    Swift的基础,操作符,字符串和集合类型
    NSNotificationCenter
    IOS中通知中心(NSNotificationCenter)的使用总结
    Swift观察者模式
    swift中通知的使用
    Swift
  • 原文地址:https://www.cnblogs.com/Tinamei/p/4459593.html
Copyright © 2020-2023  润新知