一道数列题

yunmengll 2007-08-28 01:37:35
Description

一个这样的一个实数数列:
1、这个数列共有N项;
2、这个数列的第i项等于第i-1减去第i+1项的差,再除以2,最后加上一个常数。
请你通过编程来计算这个数列的第m项。




Input

从键盘上输入两行数:
第一行输入N(表示这个数列共有多少项,其中 N<60);
第二行输入常数d,你要求的这个数列的第m项,以及这个数列的首项a[1]的值和最后一项a[N]的值.输入数据均不需判错.


Output

输出这个数列的第m项的数据。结果保留整数(用 int() 强制转换)。
...全文
1192 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
DLMU_net 2007-08-31
  • 打赏
  • 举报
回复
先mark
itegel84 2007-08-31
  • 打赏
  • 举报
回复
下班看看,好久没来CSDN了
yunmengll 2007-08-31
  • 打赏
  • 举报
回复
解错了...
yunmengll 2007-08-31
  • 打赏
  • 举报
回复
用特征值法解出来的p和q怎么可以是任意的啊?
yunmengll 2007-08-31
  • 打赏
  • 举报
回复
谢谢各位的的帮忙了.
Vitin 2007-08-29
  • 打赏
  • 举报
回复
晕,今天才发现,题目看错了。

通项公式应该是:
a[i+2] = -2*a[i+1] + 2d + a[i]

不过方法没有错,可以用这个通项公式结合之前的方法得出正确的答案。

另外,特征根法是比较专业的方法,赞一个!
deng2000 2007-08-29
  • 打赏
  • 举报
回复
试用iatsbg提到的特征根法算一下a[i]的通项公式
由题意
a[i] = (a[i-1] - a[i+1])/2 + d
因此
a[i+1] + 2a[i] - a[i-1] = 2d
故 a[i+1]-d + 2(a[i]-d) - (a[i-1)-d) = 0
令 b[i] = a[i]-d
则 b[i+1] + 2b[i] - b[i-1] = 0 (1)
(1)表明数列b[i]是个二阶齐次递推数列.因其特征方程
x^2 + 2x -1 = 0
有两个根 -1+sqrt(2) 与 -1-sqlrt(2)
因此b[i]的通项公式为
b[i] = p*(-1+sqrt(2))^i + q*(-1-sqlrt(2))^i
其中p与q为待定系数
因为a[i]=b[i]+d, 我们得到a[i]的通项公式如下:

a[i] = p*(-1+sqrt(2))^i + q*(-1-sqlrt(2))^i + d

利用边值条件(a[1]与a[N]的值)可算出p与q的值
deng2000 2007-08-29
  • 打赏
  • 举报
回复
From: tl0352118
搞得我这个喜欢数学的都不喜欢数学了
============================================

罪过罪过.是不是因为我的推导有些难以理解?如果这样的话,让我重述一下思路以将功赎罪.
题为: 若
a[i+1] + 2a[i] - a[i-1] = 2d
求a[i]的通项.
假设我们只有高中数学知识,关于数列只知道等差数列和等比数列的通项公式(而不知所谓的特征方
程为何物),让我们看看如何下手.
人们在遇到陌生事物时首先的想法就是把它与熟悉的事物对比.因此对此题而言,一个自然的思路就
是把a[i]通过某种变换转为我们熟悉的等差数列或等比数列.从直觉看变成等差数列可能性不大,那
就让我们从等比数列着手吧.
首先,等式右边的2d看着不顺眼,让我们想办法把它变成0
试令a[i] = b[i] + s, s是一个常数,则有
b[i+1] + 2b[i] - b[i-1] = 2d-2s
OK! 让s=d,右边就就为0了. 下一步任务是求b[i]的通项公式,b[i]满足:
b[i+1] + 2b[i] - b[i-1] = 0 ----------------- (1)
能把上式变成一个等比数列条件,如 c[i+1] = q*c[i] 吗?
一个比较可行的想法是下式:
b[i+1] + m*b[i] = k * (b[i] + m*b[i-1]) ---------------- (2)
其中m和k为常数. 这是一个等比数列条件式(对于数列c[i] = b[i] + m*b[i-1]),通过设m和k的值
有没有可能把(1)变成(2)呢?
其实到这一步后,解决问题就没有什么困难了.
(2)等价于
b[i+1] + (m-k)b[i] - k*m*b[i-1] = 0
和(1)相比,只需
m-k = 2
k*m = 1 --------------------- (3)
这是一个很简单的二元二次方程组,初中生都知道其解法.
解出m和k后,由(2)我们就知道
b[i+1] + m*b[i] = (b[2]+m*b[1]) * k^(i-1) --------------(4)
等等,有人会问,由(4)我们只知道b[i+1]+m*b[i]的通项,可还是不知道b[i]的通项呀?
实际上,(3)作为(判别式大于0)的二次方程有两个解.因此(4)实际上有两个等式.肖去其中的b[i+1]
就得到b[i]通项了.

最后插句题外话,(3)肖去m后得到
k*k + 2*k -1 = 0
这正是前面提到的特征方程.真是殊途同归.



virusswb 2007-08-29
  • 打赏
  • 举报
回复
肯定是递归了
a[i]=(a[i-1]-a[i+1])/2+CONST

你要知道a[0],a[1],a[2]三个才可以计算的
laiwusheng 2007-08-29
  • 打赏
  • 举报
回复
a[2]=(a[1]-a[2])/2+d
a[3]=(a[2]-a[3])/2+d
.
.
.
a[N-1]=(a[N-2]-a[N])/2+d

==>S[n]=a[1]+a[2]+a[3]+...+a[N-1]+a[N]
=a[1]+(a[1]-a[N])/2+(N-2)d+a[N]//此结果与n有关


a[1]=S[1]
a[2]=S[2]-S[1]
.
.
.
a[m]]=S[m]-S[m-1]




tl0352118 2007-08-29
  • 打赏
  • 举报
回复
搞得我这个喜欢数学的都不喜欢数学了
Vitin 2007-08-29
  • 打赏
  • 举报
回复
之前我的方案写错递推式了,现在更正一下:

正确的递推式是: a[i+2] = -2*a[i+1] + 2*d + a[i]
现在 a[1],d 都是已知的,只要知道a[2]其实就可以计算出a[m]了。
可以用 a[N]列个方程计算a[2]。

由递推式可知,a[i] 是 a[2] 的一次方程。如:
a[3] = -2*a[2] + 2d + a[1]
a[4] = -2*a[3] + 2d + a[2] = 5*a[2] - 2d - 2*a[1]
......
因此,可以令 a[i] = x[i]*a[2] + y[i]
递推计算出每个x[i]和y[i]。 然后对
a[N] = x[N]*a[2] + y[N],通过a[N]计算出a[2],再从
a[m] = x[m]*a[2] + y[m],计算出a[m]。

其中,可由递推式得到x,y的通项公式:
x[1] = 0, y[1] = a[1], x[2] = 1, y[2] = 0
x[i+2] = -2*x[i+1] + x[i], i >= 1
y[i+2] = -2*y[i+1] + 2d + y[i], i >= 1

现在,就有三种方案了:特征值法,求和法(用S[n]),一次方程法(x*a[2] + y).
呵呵,期待更多的方案。
laiwusheng 2007-08-29
  • 打赏
  • 举报
回复
我下去也笔验了一下,证明通过!
S[n]=a[1]+(a[1]+a[n])/2+(n-2)*d
此表达式可由
a[2]=(a[1]-a[2])/2+d
a[3]=(a[2]-a[3])/2+d
.
.
.
a[n-1]=(a[n-2]-a[n])/2+d
得到,似乎用不着a[N]这个条件
Vitin 2007-08-29
  • 打赏
  • 举报
回复
我觉得 laiwusheng(风清扬) 的方法可以。

1、通过 a[1] 和 a[N] 求出 S[N] 。
2、用递推式 S[i] = S[i+1] - a[i+1] , i < N
3、再用公式 S[i]=a[1]+(a[1]-a[i])/2+(i-2)d+a[i] 求出 a[i]

循环2、3两步,直到计算出 a[m].
laiwusheng 2007-08-29
  • 打赏
  • 举报
回复
还是错了,不说了
laiwusheng 2007-08-29
  • 打赏
  • 举报
回复
据上推出:
S[n]=a[1]+(a[1]+a[n])/2+(n-2)*d//a[n]待求,a[1]已知

S[2]=a[1]+a[2]=a[1]+(a[1]+a[2])/2+0*d ==>a[2]=a[1]
S[3]=[1]+a[2]+a[3]=a[1]+(a[1]+a[3])/2+(3-2)*d ==>a[3]=-a[1]+2d
S[4]=... ==>a[4]=a[1]
...
依次迭代下去.
laiwusheng 2007-08-29
  • 打赏
  • 举报
回复
Oh! n,N混淆了,全当我没说,错了!
zxwl 2007-08-29
  • 打赏
  • 举报
回复
deng2000() ( ) 的方法 赞!

学数列的时候这种好像叫做"比差数列"吧
zxwl 2007-08-29
  • 打赏
  • 举报
回复
laiwusheng(风清扬) ( )的思路比较赞,但我觉得还是有问题的
(鸡蛋、柿子朝我扔吧。。。。。。)

他的想法,认为:所有的S[m]只与m有关。这是不对的。
实际上S[m]=a[1]+(a[1]-a[m])/2+(m-2)d+a[m]//此结果不仅与m有关,还与a[m]有关
而他的特殊之处只不过是求的S[N],而只有a[N]是已知的而已!
所以用S[m]之差表示a[m]是不可取的。




PS:另外这个S[m]的通项公式要对m=1,m=2等特殊值,特殊归纳才对
Vitin 2007-08-29
  • 打赏
  • 举报
回复
laiwusheng(风清扬)的方法也很好,学习。
加载更多回复(16)

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧