指数序列包括双指数与多指数,还可以引申出“指数积”,内容非常丰富;
本节探讨双指数序列并引申至3指数序列,同时探讨应用多种思路与算法求解双指数序列;
2-3指数序列
设x,y为非负整数,试计算集合:M={ 2^x,3^y | x>=0,y>=0 }的元素由小到大排列的双指数序列第n项与前n项之和;
1.递推设计要点:
集合由2的指数与3的指数组成,实际上是给出两个递推关系,集合元素所构成的序列为2指数序列;
设置变量f存储双指数升序序列的第k项,s存储前k项之和;
显然,第1项也是最小项为f=1(当x=y=0时),s=1;
从第2项开始,为了实现从小到大排序,设置a、b两个变量,相当于设置a、b两个队列:
- a是2为底的指数队列,b是3为底的指数队列,显然a!=b;
设置k循环(k=2,3,……,n,其中n为键盘输入整数),在k循环外赋初值:“a=2;b=3;”,在k循环中通过两个队列排头的比较选择赋值:
(1)、若a< b时,由赋值f=a确定为序列的第k项;然后a=a*2,即a按递推规律乘2,为后一轮比较做准备;
(2)、若a> b时,由赋值f=b确定为序列的第k项;然后b=b*3,即b按递推规律乘3,为后一轮比较做准备;
在这一递推过程中,变量a、b是变化的,分别代表2的指数与3的指数;
为标注第k项为指数的形式设置t:
t=2为2的指数,其指数为p2;
t=3为3的指数,其指数为p3;
2.双指数序列程序实现:
#include<stdio.h>
int main()
{
int k,n,t,p2,p3;
double a,b,s,f;
printf("求序列的第n项与前n项和,请输入n:");
scanf("%d",&n);
s=1;
a=2;
b=3;
p2=0;
p3=0;
for(k=2;k<=n;k++)
{
if(a<b)
{
f=a;
a=a*2;
t=2; /*t=2表示2的指数,p2为指数*/
p2++;
}
else
{
f=b;
b=b*3;
t=3; /*t=3表示3的指数,p3为指数*/
p3++;
}
s+=f;
}
printf("序列的第%d项为:%.0f ",n,f);
if(t==2) /*对第n项进行标注*/
printf("(2^%d) \n",p2);
else
printf("(3^%d) \n",p3);
printf("序列的前%d项之和为: %.0f \n",n,s);
}
3.程序运行示例及其注意事项:
求序列的第n项与前n项和,请输入n:50
序列的第50项为:1162261467 (3^19)
序列的前50项之和为: 3890875846
注意:这一递推设计在一重循环中完成,时间复杂度与空间复杂度均为O(n);
4.拓广为3指数序列:
设a、b、c为彼此互质的正整数,x、y、z为非负整数,集合M为:
- M={ a^x,b^y,c^z | x>=0,y>=0,z>=0 }
试计算M中有多少个元素处于指定区间[u,v]中,分别输出这些元素及其和,同时指出区间[u,v]中元素由小到大排列的第n项;
输入彼此互质的正整数a、b、c,同时输入区间下限与上限u、v以及指定项数n,输出处于区间[u,v]中的元素并统计其个数与和,同时输出区间中的元素升序列的第n项;
(1)、设计要点;
集合由指定底a、b、c的指数组成,实际上是给出3个递推关系,集合元素所构成的序列为3指数序列;
设置变量f存储3指数序列的各项,k统计区间[u,v]中的项数,s存储区间[u,v]中各项之和;
显然,第1项也是最小项为f=1(当x=y=z=0时),如果u=1时,项f=1在区间内,初值为:k=1,s=1;如果u>1时,项f=1不在区间内,初值为:k=0,s=0;
1)、循环设置;
设置永真循环,从第2项开始,为了实现从小到大排序,设置ax、bx、cx表征3个指数队列的3个变量:ax是底为a的指数队列,bx是底为b的指数队列,cx是底为c的指数队列,显然ax、bx与cx互不相等;
在循环外赋初值:ax=a;bx=b;cx=c;p1=p2=p3=0;
循环中通过各队列排头的比较选择赋值:
若ax< bx且ax< cx时,由赋值f=ax确定为序列的项f;然后ax=ax*a,即ax