您的位置:首页 > 产品设计 > UI/UE

[POJ 1019]Number Sequence(递推)

2014-09-26 16:42 323 查看
题目:http://poj.org/problem?id=1019

题目大意:给出一个数字序列1,12,123,1234,12345....,求这个序列中的第n位数字

思路:先确定第n位数字所在的子序列(1234...n),然后确定这个数字在这个子序列中的位置,进而推出它对应的数

/*
对于一个数字i,易知它的位数为log10(i)+1
令a1=1,a2=2,...,an=n,a1a2a3...an的长度为len

则有递推式len[i]=len[i-1]+log10(i)+1
*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cmath>

#define MAXN 31270

using namespace std;

unsigned len[MAXN]; //len[i]=1....i的长度 eg:1...10就是12345678910,长度为11
unsigned s[MAXN]; //s[i]=a1a2a3...an的长度,eg:a1a2a3=112123,长度为6

int main()
{
int T,n,length,ans,pos;
len[1]=1,s[1]=1;
for(int i=2;i<MAXN;i++)
{
len[i]=len[i-1]+(unsigned int)log10((double)i)+1;
s[i]=s[i-1]+len[i];
}
scanf("%d",&T);
while(T--)
{
int i;
length=0; //length=当前已经遍历过的n之前的序列长度
scanf("%d",&n);
for(i=1;s[i]<n;i++);
//下面n所在的对应子序列就是ai
//对序列ai进行分解
pos=n-s[i-1]; //pos=n到序列ai-1尾巴的距离
i=1;
while(length<pos)
{
length+=(unsigned int)log10((double)i)+1; //length加上数字i的位数
i++;
}
ans=((i-1)/(int)pow((double)10,length-pos))%10;
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: