C不使用指针,实现可变长数组,求斐波那契数列

做编程题做到一题,要求斐波那契数列的第n项,以及前n项和。由于有一定的python基础,我想到可以这样做:创建一个第一、二项为0,1的列表a[2],用循环a[i]=a[i-1]+a[i-2]求出a[i]并把它append到列表里去。但C里没有列表,很遗憾我还没有学指针,而数组是“不可变长的”,原因是不定长的数组无法分配内存空间。
于是教材给的方法是,创建一个包含斐波那契数列前100项的数组,只要输入的n不超过100,就可以正常地输出,实现代码如下:
#include<stdio.h>
int main()
{
 int i,n,sum=0;
 int a[100]={0,1};
 printf("输入n的值(不超过100):\n");
 scanf("%d",&n);
 for (i=2;i<100;i++)
  a[i]=a[i-2]+a[i-1];
 for (i=0;i<=n;i++)
  sum=sum+a[i];
 printf("第%d项为:%d\n",n,a[n]);
 printf("前%d项和为:%d\n",n,sum);
 return 0;
}

我觉得这个办法相当笨,而且浪费内存空间,很不灵活。于是我就开始找“可变长数组”的实现方法。
在谭浩强的《C程序设计(第四版)》中我发现,可以在主函数之外“创建”变长数组。实现方法是:创建一个函数如int fib(int n),它接收主函数传递来的变量n,用这个n创建一个“可变长”数组。实现代码如下:
#include<stdio.h>
int main()
{
	int fib(int n);
	int n;
	printf("输入n的值:\n");
	scanf("%lld",&n);
	fib(n);
	return 0;
}
int fib(int n)
{
	int i,sum=0;
	int a[n]={0,1};
	for (i=2;i<=n;i++)
		a[i]=a[i-2]+a[i-1];
    for (i=0;i<=n;i++)
		sum=sum+a[i];
	printf("第%d项为:%lld\n",n,a[n]);
	printf("前%d项和为:%lld\n",n,sum);
	return 0;	 
 } 
需要注意的是,在函数fib中创建的数组,无法直接在主函数中调用(其实是我没找到可行的方法)。所以在以上的代码中,打印结果也是在函数fib中完成的,主函数只起到输入n和调用函数fib的作用。
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭