数字序列 Number Sequence

匿名 (未验证) 提交于 2019-12-03 00:26:01

题目描述

给出一个正整数i。编写一个程序来查找位于编号组S1S2 ... Sk序列中位置i的数字。

11212312341234512345612345671234567812345678912345678910123456789101112345678910

输入

输入文件的第一行包含一个整数t(1≤t≤10),即测试用例的数量,每个测试用例后跟一行。测试用例的行包含单个整数i(1≤i≤2147483647)

输出

每个测试用例应该有一个输出行,其中包含位于位置i的数字。

样例输入

2 8 3

样例输出

2 2

已知输入查找第 n 个位的 n 的范围为 (1 ≤ n ≤ 2147483647 ),那么至少要有 31268 个组才能使得数字序列达到有第 2147483647 位


#include <iostream> #include <cmath> using namespace std; int n; long long len[40000];//记录第i个串的长度 long long pos[40000];//记录第i个串开始位置的下标 int large[1200000];//记录最长的串 int main() { 	len[1]=pos[1]=1; 	for(int i=2;i<40000;i++) 	{ 		len[i]=len[i-1]+(int)log10(i*1.0)+1;/*(int)log10(i*1.0)+1 		是求串 1 12 123 ....112...9.10.11....后序列比前序列多出的数 		的位数,超过10以后会多一位或者更多,所以用log10()求解*/  		pos[i]=pos[i-1]+len[i-1]; 	} 	int  cnt=1; 	for(int i=1;i<40000;i++)//找到40000的目的是 找到最大序列(上文的串)  	{ 		int bit[100]; 		int k=i,num=0; 		while(k)/*将k取余放入数组bit中,但此时序列表示数的所在的位置 		是反着的,故用large转置回来 */  		{ 			bit[num++]=k%10; 			k/=10; 		} 		while(num--) 		{ 			large[cnt++]=bit[num]; 		} 	 } 	 int t; 	 cin>>t; 	 while(t--) 	 { 	 	cin>>n; 	 	int i; 	 	for(i=1;i<40000;i++) 	 	{ 	 		if(pos[i]>=n)//找到所求第n个数在第几个序列里  	 		break;  		 } 		 if(pos[i]==n)//如果那个数刚好是序列开头的第一位数输出1  		 cout<<1<<endl; 		 else 		 cout<<large[n-pos[i-1]+1]<<endl;//否则输出的数 从large中找  	  }  	  return 0;  } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!