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

来源:互联网 发布:c语言100以内素数之和 编辑:程序博客网 时间:2024/04/29 12:35

     最近csdn上有出了好多道题目,做了几道题,却一直没发上来,今天就吧这道数列问题解法放上来。

数列问题
  • 发布公司:
  • 有 效 期:
  • 赛 区:
  • CSDN
  • 2014-02-262014-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;
            }

这样就得到结果了。
1 0
原创粉丝点击