POJ 1019 Number Sequence

      这个题目我在很久以前做过,不过是很蠢的方法,结果还是用了16ms,现在几乎是暴力都能0ms AC,一年的时间过得好快,两年的时间也好快。。。。我的方法应该很好理解,首先是要一路减下去,先确定这个数是在 多大 的范围内,然后再确定。我先自己确定了一下2147483647个数 大约在1-150000范围内。所以是10^6,t=10;故最多是 10^7。这样做不会爆。

代码:

#include<iostream>
using namespace std;
int num[10]={0,9,99,999,9999,99999,999999,9999999};
void Solve(int i,int n)
{
     if( n%i==0)
         printf("%d\n",(n/i+num[i-1])%10);
     else{
          for(int j=1;j<=6;j++){
                  if( n%i==j){
                      printf( "%d\n",(n/i+1+num[i-1])%(num[i-j+1]+1)/(num[i-j]+1) );
                      break;
                  }
          }
     }
}
int main()
{
    int n,t;
    scanf("%d",&t);
    int cnt=0,i,x;
    while( t--){
           scanf("%d",&n);
           cnt=0;
           for( i=1; n>0;i++){
                if( i<10){
                    cnt+=1;
                    n-=cnt;
                }
                else if( i<100){
                     cnt+=2;
                     n-=cnt;
                }
                else if( i<1000){
                         cnt+=3;
                         n-=cnt;
                }
                else if( i<10000){
                         cnt+=4;
                         n-=cnt;
                }
                else if( i<100000){
                         cnt+=5;
                         n-=cnt;
                }
                else{
                     cnt+=6;
                     n-=cnt;
                }
           }  //确定这个数是几; 
           n+=cnt;
          
           for( i=1; i<=6;i++){   //进一步缩小到是几位的 
                x=i*(num[i]-num[i-1]);
                if( n>x)
                    n-=x;
                else
                    break;
           }
       
           Solve(i,n);
    }                      
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值