Fibonacci 数列与黄金分割【第十届】蓝桥杯

题目如下

Fibonacci 数列与黄金分割【第十届】蓝桥杯_第1张图片


题解思路:

初次看题,以为是简简单单的大数除法,之后一顿操作零分拿下(理解错题意了)

后来才发现斐波那契数列增长速度极快

斐波那契数列第100位数值:
354224848179261915075

斐波那契数列第1000位数值:
43466557686937456435688527675040625802564660517371780402
48172908953655541794905189040387984007925516929592259308
03226347752096896232398733224711616429964409065331879382
98969649928516003704476137795166849228875
————————————————
原文链接:https://blog.csdn.net/weixin_45791152/article/details/104522781

因为题目说两数相除趋近一个值,因此可以猜想在n位后比值相同

之后采取试探输出的方法,发现比值在n = 40左右的时候固定在了0.61803399

cout << tem_1 << " " << tem_2 << endl;	

由此可以得到越往后越接近0.61803399

由于保留8位,所以n>40后固定输出0.61803399


本题收获:

斐波那契数列增长的好快啊QwQ

由于其通项公式是指数函数,所以是指数爆炸式增长

printf("%.8f\n", tem_1*1.0 / tem_2);

这里的 tem_1*1.0 可以得到浮点数,否则整数的 ll 相除输出值仍为整数


源码如下:

#include 
#include 
#include
#include
#include 
using std::set;
typedef long long ll;
using namespace std;

ll ans;
ll n;
ll tem_1 = 1, tem_2 = 1;
int main() {
	cin >> n;
	if (n == 2) {
		cout << "0.50000000" << endl;
	}
	if (n > 40) {
		cout << "0.61803399" << endl;
		return 0;
	}
	for (int i = 3; i <= n + 1; i++) {
		int tem = tem_1 + tem_2;
		tem_1 = tem_2;
		tem_2 = tem;
	}
	//cout << tem_1 << " " << tem_2 << endl;	
	printf("%.8f\n", tem_1*1.0 / tem_2);
	return 0;
}

你可能感兴趣的:(蓝桥杯历年真题,c++,蓝桥杯)