您的位置:首页 > 编程语言 > C#

数列问题-c#求解-英雄会在线编程题目

2014-03-05 11:01 274 查看
最近csdn上有出了好多道题目,做了几道题,却一直没发上来,今天就吧这道数列问题解法放上来。

数列问题

发布公司:
有 效 期:
赛 区:

CSDN

2014-02-26至2014-03-28

北京

难 度 等 级:
答 题 时 长:
编程语言要求:











120分钟
C C++ Java C#

题目详情
给定一个正整数n,我们把从1到n的数连接起来形成一个数n1,例如n=11,我们得到的n1=1234567891011,然后我们删掉这个数中在偶数位置的数字,得到数字n2(例子中n2=1357901), 我们再删除n2中奇数位置的数字得到数字n3(例子中n3=370),重复上面的删数字过程,直到剩余一个数字,求最后剩余的数字。 (1<=n<=99999)。

这道题的思路比较简单,当然解法也有很多。
思路:
1、首先根据题目要求,当数字超过一位的时候,写上去就要相应的变长,比如说,10,写上去的时候相当于两位,所以,我们要统计给出的n是一个多长的字符串?
2、此长度的字符串,需要经过多少轮,最后只剩一个。
3、然后再逆推回去,最后这个字符在原来字符串中的位置。
4、根据位置,找到此位置的字符是几。

步骤:

根据思路,一步一步求解

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;

}

这样就得到结果了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: