最近csdn上有出了好多道题目,做了几道题,却一直没发上来,今天就吧这道数列问题解法放上来。
步骤:
根据思路,一步一步求解
1、第一步求给出的n能够写成多长的字符串,这个比较容易。
int lenght = 0;
int p=0;
int t=n;
int count =0;
while (t > 9)
{
p++;
lenght +=(int)( p * (Math.Pow(10, p) - Math.Pow(10, p - 1)));
t = t / 10;
}
lenght += (int)((p+1)*(n - Math.Pow(10, p)+1));
第二步:求出了长度lenght,就需要知道,经过多少轮后只剩一个字符。
t = lenght;
while (t > 1)
{
if (count % 2 == 0)
{
if (t % 2 == 1)
{
t = (t + 1) / 2;
}
else
{
t = t / 2;
}
}
else
{
if (t % 2 == 1)
{
t = (t - 1) / 2;
}
else
{
t = t / 2;
}
}
count++;
}
第三步就是逆推回去了,最后留下的这个字符,编号为1,那么它在原来的字符串中的编号。这里需要注意,我们假设原来的字符串编号是从1开始的。因为这里主要都是按照个数来算的。
p = 1;
while (count > 0)
{
if (count % 2 == 0)
{
p = p * 2;
}
else
{
p = 2 * p - 1;
}
count--;
}
所以我们很容易逆推回去,最后留下的这个字符在原有字符串中的编号。
第四步:就是搞清楚第几个字符是多少。
规律很简单,1~9,都是1位的
10~99都是两位的,
......
直到我们找到n所在的范围区间,就可以了。
t = p;
p = 0;
lenght = 0;
int tmp = 0;
while (true)
{
p++;
tmp= (int)(p * (Math.Pow(10, p) - Math.Pow(10, p - 1)));
if (t <= lenght+tmp)
{
t = t - lenght;
int yushu = t % p;
int cusu = t / p;
if (yushu == 0)
{
yushu = p;
cusu--;
}
result = (int)Math.Pow(10, p - 1) + cusu;
result = Convert.ToInt32(result.ToString().Substring(yushu - 1, 1));
break;
}
lenght += tmp;
}