Hdu 1597 find the nth digit

题意:

假设:
S1 = 1
S2 = 12
S3 = 123
S4 = 1234
.........
S9 = 123456789
S10 = 1234567891
S11 = 12345678912
............
S18 = 123456789123456789
..................
现在我们把所有的串连接起来

S = 1121231234.......123456789123456789112345678912.........

求第N个数是什么数字

首先我不先连起来,看红色的部分,我们先确定n在第几行第几个数,因为所有行的个数程等差数列,所以可以这样确定初始行:

t=sqrt(2.0*n),然后在t行的基础上找到大于等于n的那一行 i,然后再找前一行,用n-sum(i-1)就是它在第i行的第几位

所以思路为:

//对于任意的数 N,
//先确定其区间 si - si+1
//确定其区间后
//再确定 在si中第几个 1234456789 ,
//然后再确定第几位数

代码:

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#define lson l,mid,num<<1
#define rson mid+1,r,num<<1|1
using namespace std;
const int M=100005;
int a[9]={1,2,3,4,5,6,7,8,9};
int sum(int n)
{
    if(n%2)return n*((n+1)/2);
    else
        return (n/2)*(n+1);
}
int main()
{
    int k,n;
    while(scanf("%d",&k)!=EOF)
    {
        while(k--)
        {
            scanf("%d",&n);
            int t=sqrt(2.0*n);
            int i;
            for(i=t;; i++)
            {
                if(sum(i)>=n)break;
            }
            int tt=n-sum(i-1);
            tt--;
            printf("%d\n",a[tt%9]);
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值