POJ 1019、数列

制限時間:1000msのメモリ制限:10000K
総提出:17288受理:4563


説明は、
単一の正の整数iが与えられています。数グループS1S2 ...、SKの配列の位置Iにある数字を見つけるためのプログラムを書きます。Skは1からKまでの範囲の正の整数の配列からなる各グループは、次々に書き込ま。
例えば、以下のように配列の最初の80桁は、次のとおり
11212312341234512345612345671234567812345678912345678910123456789101112345678910

 

入力
入力ファイルの最初の行は、各テストケースのための1つの行に続く単一の整数t(10≤1≤t)は、テストケースの数を含んでいます。テストケースのためのラインは、単一の整数Iを(1≤iは2147483647を以下)含有します

 

出力
位置Iにある数字を含むテストケースごとに一つの出力ラインがあるはずです。

 

サンプル入力
2
8
3

 

サンプル出力
2
2

 

ソース
テヘラン2002年、まずイラン全国のインターネットプログラミングコンテスト


//  POJ1019.cppは:コンソールアプリケーションのエントリポイントを定義します。
//

する#include 
< iostreamの >
の#include 
< sstream提供 > 使用して名前空間 はstdを、インライン  INT  getlen(int型 I){ 場合 (I  < 10 )  リターン1 それ以外の場合 (I  < 100 )  のリターン2 それ以外の場合 (私は  < 1000 )  の戻り3 。    それ以外の場合
 


    
   
    
     
    
     
    
   (I  < 10000 )  リターン4 。    それ以外の場合 (I  < 100000 )  のリターン5 リターン0 ; } インライン  チャー GETCHAR(INT  NUM、  INT  P){     にstringstreamのSS。    SS  <<  NUM。文字列 sの。    SS  >>  秒; リターン S [P - 1 ]。} int型 のmain(int型 ARGC、  チャー*の ARGV [])    
    
     
    
 





    


    



{
    
// 初期化テーブル のconst int型 SIZE  = 40000     __int64和[SIZE]。    和[ 0 ] = 0 以下のためにint型 のI  = 1 ; iは  <  サイズ; ++ I)        和[I] = 和[I - 1 ] + getlen(I)。以下のためにint型 私  = 1 ; iが  <  サイズ;  ++ i)の        和[I]  + = 和[I - 1 ]。
        



    
 


    
 


    
int型  のケースを。
    scanf関数(
" %のD " 、  場合)。
    __int64のNUM;
    
 ( INT  C  = 0 ; C  <  ケース;  ++ C)    {         scanf関数(" %I64d " 、  NUM)。//  K番目のグループのint  、K  = 1 一方、(和[K]  <  NUM)  ++ 、K。// 数のposth文字私はint型 POS  =  NUM  -  合計[K  



        

          
        

        
        

         - 1 ]。
        
int型  I = 1 ;
        
一方 (POS - getlen(I) > 0 )POS  - =  getlen(I)、  ++ I。        coutの  <<  GETCHAR(I、POS)  <<  てendl;     } 戻り0 }  




    
 


ます。https://www.cnblogs.com/asuran/archive/2009/10/17/1584885.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33756418/article/details/94139752