UVA10706数字连排,求第i个位置的数字,二分

来源:互联网 发布:crt连接linux服务器 编辑:程序博客网 时间:2024/05/20 10:23

一个数组记录,是s1s2....sk的数字个数,然后二分,转化为字符串,即可求出第i个位置的数字,具体的看代码:

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<string>#include<set>#include<map>#include<iostream>#include<algorithm>#include<vector>#include<cctype>#include<queue>#define LL long longusing namespace std;const int maxn=1e7+10;const double eps=1e-8;const int Max=2147483647;LL s[maxn];LL vi;int i;void init(){    int tt=1;    int tem=0;    s[0]=0;    int c=10;    for(i=1;s[i-1]<=Max;i++)    {        if(i==c)        {            tt++;            c*=10;        }        tem=tem+tt;        s[i]=s[i-1]+tem;    }}int main(){   int t;   cin>>t;   init();   i--;   while(t--)   {       scanf("%lld",&vi);       LL l=0,r=i;       while(l<r)       {           LL m=l+(r-l)/2;           if(s[m]>=vi)            r=m;           else            l=m+1;       }       if(vi==s[l])       {           cout<<l%10<<endl;           continue;       }       l--;       vi-=s[l];       string ss="";       char tem[10];       for(int j=1;j<=i+1;j++)       {           sprintf(tem,"%d",j);           ss=ss+tem;           if(ss.length()>=vi)            break;       }       cout<<ss[vi-1]<<endl;   }    return 0;}


0 0
原创粉丝点击