数据结构10——k阶斐波那契数列(严3.32)

Description

试利用循环队列编写k阶斐波那契数列中前n+1项 (f(0),f(1),…,f(n))的程序,要求满足: f(n)<=max而f(n+1)>max,其中max为某个约定的常数。(注意:本题所用循环队列的容量仅为k,则在程序执行结束时,留在循环队列中的元素应是所求k阶斐波那契序列中的最后k项 f(n-k+1),…,f(n))。

Input

输入常数max(0<max<10000),阶数k(1<k<100),用空格隔开。

Output

输出k阶斐波那契数列中的最后k项f(n-k+1),…,f(n)。

  • Sample Input 
    14 2
  • Sample Output
    8 13

#include<stdio.h>
int main(){
	int arr[1000] = {0}, sum[1000] = {0};
	int max, k, i, tmp;
	scanf("%d%d",&max, &k);
	arr[k] = 1;
	sum[k] = 1;
	for(i = k+1; ; i++){
	    arr[i] = sum[i-1];
		sum[i] = sum[i-1] - arr[i-k] + arr[i];
	    if(arr[i] > max && arr[i-1] <=max){
		    tmp = i;
		    break;
		}
	}
	int flag = 1;
	for(i = tmp-k; i < tmp ;i++){
		if(flag){
		     printf("%d", arr[i]);
			 flag = 0;
		}
		else{
		     printf(" %d", arr[i]);
		} 
	}
	printf("\n");
	return 0;
}
#include<stdio.h>
#include<stdlib.h>

typedef struct data{
	int num;
	struct data *next;
}data;

typedef struct queue{
	data *head;
	data *rear;
	data *k_before;
}queue;

void init(queue *list,int k){
	int i;
	data *p = (data*) malloc (sizeof(data));
	p->num = 0;
	p->next = NULL;
	list->head = p;
	list->rear = p;
	list->k_before = p;
	for(i = 0; i < k-2; i++){
	    data *p = (data*) malloc (sizeof(data));
		p->num = 0;
		p->next = NULL;
		list->rear->next = p;
		list->rear = p;
	}
	for(i = 0; i < 2; i++){
	    data *p = (data*) malloc (sizeof(data));
		p->num = 1;
		p->next = NULL;
		list->rear->next = p;
		list->rear = p;
	}
}

void pop(queue *list){
	data *p;
	p = list->k_before;
	while(p->next != list->rear){
	     printf("%d ", p->num);
		 p = p->next;
	}
	printf("%d\n", p->num);
}

void push(queue *list, int z){
    data *q;
    q = (data*) malloc (sizeof(data));
	/*p = list->head;
	list->head = p->next;
	free(p);*/
	q->num = z;
	q->next = NULL;
	list->rear->next = q;
	list->rear = q;
	list->k_before = list->k_before->next;
}

int main(){
     int max,k,x,y,z;
	 scanf("%d%d", &max, &k);
	 queue *list = (queue*) malloc (sizeof(queue));
	 init(list, k);
	 while(1){
		 x = list->rear->num;
		 y = list->k_before->num;
		 z = 2*x - y;
		 if(x > max){
		     pop(list);
			 break;
		 }
		 else{
		     push(list, z);
		 }
	 }
	 return 0;
}


复习:

#include<stdio.h>
#include<stdlib.h>

typedef struct node{
	int num;
	struct node *next;
}node;

typedef struct queue{
	struct node *head;
	struct node *rear;
	struct node *k_before;
}queue;

void init(queue *list, int k){
	node *p, *q;
	int i;
	p = (node*)malloc(sizeof(node));
	p->num = 0;
	p->next = NULL;
	list->head = p;
	list->rear = p;
	list->k_before = p;
	for(i = 0; i < k-2; i++){
		q = (node*)malloc(sizeof(node));
		q->num = 0;
		q->next = NULL;
		p->next = q;
		q = p;
	}
	for(i = 0; i <2; i++){
		q = (node*)malloc(sizeof(node));
		q->num = 1;
		q->next = NULL;
		p->next = q;
		p = q;
	}
	list->rear = p;
}

void push(queue *list, int x){
	node *p;
	p = (node*)malloc(sizeof(node));
	p->num = x;
	p->next = NULL;
	list->rear->next = p;
	list->rear = p;
	list->k_before = list->k_before->next;
}

void pop(queue *list){
	node *p;
	p = list->k_before;
	while(p->next != list->rear){
		printf("%d ", p->num);
		p = p->next;
	}
	printf("%d\n", p->num);
}

int main(){
	int max, k, x, y, z;
	scanf("%d%d", &max, &k);
	queue *list = (queue*)malloc(sizeof(queue));
	init(list, k);
	while(1){
		x = list->rear->num;
		y = list->k_before->num;
		z = 2*x - y;
		if(x > max){
			pop(list);
			break;
		}
		else{
			push(list, z);
		}
	}
	return 0;
}


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值