a,b,c:array[1100] of longint;
h1,h2,n1,n2,t,i:longint;
begin
read(n1,n2);
for i:=1 to n1 do read(a[i]);
for i:=1 to n2 do read(b[i]);
t:=0; h1:=1; h2:=1; {h1,h2:分别指向a,b待处理的元素下标}
repeat
inc(t); {t:指向合并后c的元素下标}}
if (a[h1]<b[h2]) then {选择小的元素放入c中}
begin
c[t]:=a[h1]; {复制元素}
inc(h1); {跳过已复制的元素}
end
else begin
c[t]:=b[h2];
inc(h2);
end;
until (h1=n1+1)or(h2=n2+1); {直到a,b中至少有一个为空}
if h1<=n1 then {如a数列未处理完}
begin
for i:=h1 to n1 do {将a数列中剩余元素全部复制到c中}
begin
inc(t);
c[t]:=a[i];
end;
end;
if h2<=n2 then {如b数列未处理完}
begin
for i:=h2 to n2 do {将b数列中剩余元素全部复制到c中}
begin
inc(t);
c[t]:=b[i];
end;
end;
for i:=1 to t do write(c[i],' ');end {输出完成后c数列}#include<stdioh>
void main()
{
int a[]={1,7,9,11,13,15,17,19};
int b[]={2,4,6,8,10};
int c[13];
int x=a,y=b,z=c;
int i=0,j=0,k=0;
while(i<8&&j<5)
{
if(x[i]<y[j]) z[k++]=x[i++];/x[i] 可以用 (x+i) 替换,其他类同/
else z[k++]=y[j++];
}
while(i<8) z[k++]=x[i++];
while(j<5) z[k++]=y[j++];
for(i=0;i<13;i++) printf("%d ", c[i]);
getch();
}一、利用常用求和公式求和
利用下列常用求和公式求和是数列求和的最基本最重要的方法
1、 等差数列求和公式:
2、 等比数列求和公式:
自然数方幂和公式:
3、 4、
5、
[例] 求和1+x2+x4+x6+…x2n+4(x≠0)
∴该数列是首项为1,公比为x2的等比数列而且有n+3项
当x2=1 即x=±1时 和为n+3
评注:
(1)利用等比数列求和公式.当公比是用字母表示时,应对其是否为1进行讨论,如本题若为“等比”的形式而并未指明其为等比数列,还应对x是否为0进行讨论.
(2)要弄清数列共有多少项,末项不一定是第n项.
对应高考考题:设数列1,(1+2),…,(1+2+ ),……的前顶和为 ,则 的值
二、错位相减法求和
错位相减法求和在高考中占有相当重要的位置,近几年来的高考题其中的数列方面都出了这方面的内容需要我们的学生认真掌握好这种方法这种方法是在推导等比数列的前n项和公式时所用的方法,这种方法主要用于求数列{an�� bn}的前n项和,其中{ an }、{ bn }分别是等差数列和等比数列求和时一般在已知和式的两边都乘以组成这个数列的等比数列的公比 ;然后再将得到的新和式和原和式相减,转化为同倍数的等比数列求和,这种方法就是错位相减法
[例] 求和:( )………………………①
由题可知,{ }的通项是等差数列{2n-1}的通项与等比数列{ }的通项之积
设 ………………………② (设制错位)
①-②得 (错位相减)
再利用等比数列的求和公式得:
∴
注意、1 要考虑 当公比x为值1时为特殊情况
2 错位相减时要注意末项
此类题的特点是所求数列是由一个等差数列与一个等比数列对应项相乘
对应高考考题:设正项等比数列 的首项 ,前n项和为 ,且 (Ⅰ)求 的通项; (Ⅱ)求 的前n项和
三、反序相加法求和
这是推导等差数列的前n项和公式时所用的方法,就是将一个数列倒过来排列(反序),再把它与原数列相加,就可以得到n个
[例] 求证:
证明:设 …………………………①
把①式右边倒转过来得
(反序)
又由 可得
………………②
①+②得 (反序相加)
∴
四、分组法求和
有一类数列,既不是等差数列,也不是等比数列,若将这类数列适当拆开,可分为几个等差、等比或常见的数列,然后分别求和,再将其合并即可
若数列 的通项公式为 ,其中 中一个是等差数列,另一个是等比数列,求和时一般用分组结合法
[例]:求数列 的前n项和;
分析:数列的通项公式为 ,而数列 分别是等差数列、等比数列,求和时一般用分组结合法;
[解] :因为 ,所以
(分组)
前一个括号内是一个等比数列的和,后一个括号内是一个等差数列的和,因此
五、裂项法求和
这是分解与组合思想在数列求和中的具体应用裂项法的实质是将数列中的每项(通项)分解,然后重新组合,使之能消去一些项,最终达到求和的目的通项分解(裂项)如:
(1) (2)
(3) (4)
(5)
[例] 求数列 的前n项和
设 (裂项)
则 (裂项求和)
=
=
小结:此类变形的特点是将原数列每一项拆为两项之后,其中中间的大部分项都互相抵消了只剩下有限的几项
注意:余下的项具有如下的特点
1余下的项前后的位置前后是对称的
2余下的项前后的正负性是相反的
[练习] 在数列{an}中,,又 ,求数列{bn}的前n项的和#include<stdioh>
#define N 5//预定义数组长度
#define M 6
void SelectSort(int a[],int n)//使用选择排序进行不减排序
{
int i,t,min,tmp;
for(i=0;i<n;i++)
{
min=i;
for(t=i+1;t<n;t++)
{
if(a[min] > a[t])
min=t;
}
if(min!=i)
{
tmp=a[i];
a[i]=a[min];
a[min]=tmp;
}
}
}
int main()
{
int a[N]={12,2,5,45,8},b[M]={58,7,6,98,5,12},c[M+N];//预设测试数据
int i,j,k;
SelectSort(a,N);//先对两个无序数组进行排序
SelectSort(b,M);
i=0;
j=0;
k=0;//c数组下标
while(i<N && j<M)//数组a,b有元素
{
if(a[i] >= b[j])//将两者较小者放进数组c
{
c[k]=b[j];
k++;
j++;//b数组指向下一个
}
else
{
c[k]=a[i];
k++;
i++;//a数组指向下一个
}
}
while(i<N)//处理剩余元素
{
c[k]=a[i];
k++;
i++;
}
while(j<M)//处理剩余元素
{
c[k]=b[j];
k++;
j++;
}
for(i=0;i<M+N;i++)//输出检验
printf("%d ",c[i]);
printf("\n");
return 0;
}
望采纳~~~谢谢!很明显你的意思是用b数组存按从小到大的顺序排序后的数据。问题出在变量j上。假如b[j]<a[i],除非b[j]是最后一个数,否则其后的数就被覆盖了。若b[j]>a[i],除非b[j]是最后一个数,否则其后的数b[j+1]也被覆盖了。一般数列的求和方法
(1)直接求和法,如等差数列和等比数列均可直接求和.
(2)部分求和法将一个数列分成两个可直接求和的数列,而后可求出数列的前n项的和.
(3)并项求和法将数列某些项先合并,合并后可形成直接求和的数列.
(4)裂项求和法将数列各项分裂成两项,然后求和.
(5)错位相减求和法.用Sn乘以q,若数列{an}为等差数列,{bn}为等比数列,则求数列{anbn}的前n项的和均可以采用此方法.
(6)拟等差,写成一堆式子再相加(叠加)
(7)累乘法
例子就看下面的链接吧
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)