数列问题-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;
}
这样就得到结果了。
数列问题
发布公司:
有 效 期:
赛 区:
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;
}
这样就得到结果了。
相关文章推荐
- 罐子和硬币-c#求解-英雄会在线编程题目
- 博弈游戏(2)-c#求解-英雄会在线编程题目
- 堆放木块-c#求解-英雄会在线编程题目
- F(X)--c#求解-英雄会在线编程题目
- 火车调度-c#求解-英雄会在线编程题目
- 24点游戏-c#求解-英雄会在线编程题目
- 朋友的礼物-c#求解-英雄会在线编程题目
- 2·14 情人&元宵节专题:半质数的个数-c#求解-英雄会在线编程题目
- P次方数-c#求解-英雄会在线编程题目
- 二叉树-c#求解-英雄会在线编程题目
- 另类编辑距离-c#求解-英雄会在线编程题目
- P次方数-c#求解-英雄会在线编程题目
- 彩色石子-c#求解-英雄会在线编程题目
- 建立信号基站-c#求解-英雄会在线编程题目
- 排列搜索-c#求解-英雄会在线编程题目
- 无穷字符串-c#求解-英雄会在线编程题目
- 平衡二叉树--c#求解--英雄会在线编程题目
- 最小操作数-c#求解-英雄会在线编程题目
- -3+1-c#求解-英雄会在线编程题目
- xor值最大-c#求解-英雄会在线编程题目