1.试利用环队列设计出计算K阶斐波那契序列中前n+1项(f0,f1…fn)的算法, 要求满足:fn≤max,其中max为某个约定的常数。(注意:本题所用循环队列的容量仅为k,则在算法执行结束时,留在循环队列中的元素应是所求k阶斐波那契序列中的最后k项fn-k+1,……fn)。
时间: 2023-05-29 17:02:40 浏览: 122
算法思路:
首先需要借助一个k大小的循环队列来存储k阶斐波那契序列中的最后k项。初始化时,将队列中的所有元素都置为0,并将队列头指针front和队列尾指针rear都置为0。
然后开始循环,从0到n-1逐个计算斐波那契数列的值并将其存入队列中,如果队列满了则删除队列头元素。最后留在队列中的就是所求的k阶斐波那契序列中的最后k项。
具体算法如下:
1.定义一个长度为k的循环队列,初始化队列中的所有元素为0,队列头指针front和队列尾指针rear都置为0。
2.计算斐波那契数列中前k项的值,并依次存入队列中。
3.从第k项开始循环计算斐波那契数列的值并将其存入队列中。如果队列已满,则删除队列头元素。
4.循环结束后,留在队列中的元素就是所求的k阶斐波那契序列中的最后k项。
算法实现:
//计算斐波那契数列中前k项的值,并依次存入队列中
for(int i=0;i<k;i++){
if(i==0){
queue[0] = f0;
continue;
}
if(i==1){
queue[1] = f1;
continue;
}
queue[i] = queue[i-1] + queue[i-2];
}
//从第k项开始计算并存入队列中
for(int i=k;i<n;i++){
int sum = 0;
for(int j=0;j<k;j++){
sum += queue[(front+j)%k];
}
if(sum<=max){
queue[rear] = sum;
rear = (rear+1)%k;
front = (front+1)%k;
}else{
break;
}
}
//留在队列中的元素即为所求
for(int i=front;i!=rear;i=(i+1)%k){
cout<<queue[i]<<" ";
}
阅读全文