循环数组
在程序中,存储的数据只使用一次之后再不会使用,如果将所有数据存储起来会浪费很大的空间,所以可以用循环数组来完成数据使用。我们用下面的例题来解释
例题
斐波那契数列中的每一项都是前两项的和。由1和2开始生成的斐波那契数列前10项为:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …
考虑该斐波那契数列中不超过四百万的项,求其中为偶数的项之和。
例题解析
在不使用循环数组的情况下,可以开一个数组num[4000000]
(四百万项是肯定够的)来储存数据,然后通过计算来完成目的,这是我们不使用循环数组的做法。当使用循环数组时可以开一个数组num[3]
来循环储存数据,这样就会节约大量空间。下面用伪代码解释原理
//假设求斐波那契数列第一项的数据(n = 1)(也就是求num[1]),那么复制时num[1]可以随便赋值,但(n = 1)num[(n + 1) % 3],num[(n + 2) % 3]代表斐波那契数列第一项前面的两项,分别赋值为1,0
//通过%3来完成数组的循环
int num[3] = {1, 0 , 0};
int n = 1;
while (num[(n + 2) % 3] + num[(n + 1) % 3] <= 4000000) {
num[n % 3] = num[(n + 2) % 3] + num[(n + 1) % 3];
n++;
}
代码演示
#include <stdio.h>
int main() {
int f[3] = {1, 0, 0}, sum = 0, n = 1;
while (f[(n + 2) % 3] + f[(n + 1) % 3] <= 4000000) {
f[n % 3] = f[(n + 1) % 3] + f[(n + 2) % 3];
if ((f[n % 3] & 1) == 0) sum += f[n % 3];
n += 1;
}
printf("%d\n", sum);
return 0;
}