赞
踩
看到这道题时,斐波那契数组的基因已经开始颤抖了吧,
此时,开始第一部分:
可以先打出一个基础求斐波那契数列求第n项的代码:
- #include <iostream>
- using namespace std;
- int main()
- {
- int n, a = 1, b = 1, sum = 0, i;
- cin >> n;
- if (n <= 2)
- {
- cout << "1" << endl;
- }
- else
- {
- for (i = 2; i < n; i++)
- {
- sum = a + b;
- a = b;
- b = sum;
- }
- cout << sum << endl;
- }
- return 0;
- }
接下来,只需对其进行微调,即可完成 “ 小杨做题 ”
首先:输入的a,b,n,m,c
a,是斐波那契数列第一个数
b,是斐波那契数列第二个数
n,是数列长度,也就是范围
m,是判定数列的和
经过分析,小杨既然每天写前两天的和,那么他前几天写的,那就正是规定天数写的数量。
那么我们定义一个 “ ans ”,为第三个数,也就是每次判定小杨作业之和的变量。
那么,便可以完成程序的第一部分:
- int a, b, n, m, c;
- int ans;
- cin >> a >> b >> m >> n;
- ans = a + b;
已经有了这些变量,开始第二部分:斐波那契数列的循环
这一部分没有什么强调的,一个循环,第一个变量第二个变量的轮流切换,再加上题目已给出的判定是否 " 大于等于m " 就可以完成第二部分:
- for (int i = 3; i <= n; i++)
- {
- c = a + b;
- ans += c;
- a = b;
- b = c;
- if (c >= m)
- {
- break;
- }
- }
记得吗,在斐波那契数列中,有对非常不规则的兄弟俩,“ 1 ”,“ 1 ”这对数正是数组的前两个数,这俩中的第二个“ 1 ”甚至是斐波那契随便安排的一个数,毕竟因为这第二个数看前面只有一个数,看后面,还有无数个数等着它呢。
那么,第一个数和第二个数便需要特殊处理,用两个if判断,便可以完成:
- if (n == 1)
- {
- ans = a;
- }
- if (n == 2)
- {
- ans = a + b;
- }
当然,有始有终,别忘了输出,最后的代码是这样的:
- #include <bits/stdc++.h>
- using namespace std;
- int main()
- {
- int a, b, n, m, c;
- int ans;
- cin >> a >> b >> m >> n;
- ans = a + b;
- for (int i = 3; i <= n; i++)
- {
- c = a + b;
- ans += c;
- a = b;
- b = c;
- if (c >= m)
- {
- break;
- }
- }
- if (n == 1)
- {
- ans = a;
- }
- if (n == 2)
- {
- ans = a + b;
- }
- cout << ans;
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。