制限時間: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 。}
//
する#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で再現