Digit | ||
Accepted : 4 |
| Submit : 9 |
Time Limit : 10000 MS |
| Memory Limit : 65536 KB |
题目描述 我们把十进制整数依次写成一个字符串,123456789101112…请问第n位数码是多少? 输入 第一行是一个整数T(T≤10000),表示样例的个数。 每行输入一个整数n(1≤n≤788888899)。 输出 每行输出一个样例的结果。 样例输入 2 1 788888899
样例输出 1 1 |
找规律的题目,一位数的个数有9个,两位数的个数有90个,三位数的个数有900个......然后根据这个规律,假设题目中给出一个长度,我们通过累加可以知道在这个长度时所对应的那个数字的位数,知道了位数,就可以找到这个数,然后通过取余操作得到要获取这个数的哪一位,需要向上取整操作
#include <iostream>
#include <cmath>
#include <stdio.h>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <iomanip>
#include <algorithm>
#include <memory.h>
using namespace std;
int num_len[100];
int pow(int n)
{
int sub=1;
for(int i=1;i<n;i++)
sub*=10;
return sub;
}
void init()
{
int i;
num_len[0]=0;
for(i=1;;i++)
{
num_len[i]=num_len[i-1]+i*9*pow(i);
if(num_len[i]>=788888889)
{
num_len[i+1]=788888999;
// cout<<i<<" "<<num_len[i]<<endl;
break;
}
}
}
int main()
{
int t,n,i,left;
int num;
init();
cin>>t;
while(t--)
{
cin>>n;
for(i=1;;i++)
{
if(num_len[i]>=n)
break;
}
//cout<<i<<endl;
left=n-num_len[i-1];
// if(left%2==0)
{
num=pow(i);
num+=left/i+(left%i==0?0:1)-1;
//cout<<num;
if(left%i==0)
cout<<num%10<<endl;
else
{
char temp[20];
itoa(num,temp,10);
cout<<temp[left%i-1]<<endl;
}
}
}
return 0;
}