BestCoder10 1001 Revenge of Fibonacci(hdu 5018) 解题报告

本文介绍了一种使用滚动数组思想解决的问题——判断一个数是否存在于由特定初始值生成的新斐波那契数列中。通过对输入的A、B、C三个数进行处理,利用数组迭代更新的方式,在合理内存占用下高效地找到了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5018

 

题目意思:给出在 new Fibonacci 中最先的两个数 A 和 B(也就是f[1] = A, f[2] = B),通过这条式子f[n] = f[n-1] + f[n-2],问 C 是否在这条 new Fibonacci sequence 内。(1 <= A, B, C <= 1 000 000 000)

    首先,要想到 C 有可能是 A 或者 B,这种情况也是属于在这个序列范围内的。

    还有一个地方,不要固定死数组的长度,因为不确定到底需要多大的空间存下来,而且,确实比较浪费空间,当前需要求出一个新的数,其实就是需要前面的两个数而已,再前面的根本就没什么用。

    于是我这里就用到滚动数组的思想,只开了长度为 4 的数组,不断迭代来判断在 1000 000 000 的范围内,能否得到 C 这个数。

   

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int INF = 1e9;
 8 __int64 A, B, C;
 9 __int64 f[4];
10 
11 int main()
12 {
13     int T, i;
14     while (scanf("%d", &T) != EOF)
15     {
16         while (T--)
17         {
18             scanf("%I64d%I64d%I64d", &A, &B, &C);
19             f[0] = 0;
20             f[1] = A;
21             f[2] = B;
22             if (C == A || C == B)
23                 printf("Yes\n");
24             else
25             {
26                 bool flag = 0;
27                 for (i = 3; ; i++)
28                 {
29                     f[0] = f[1];
30                     f[1] = f[2];
31                     f[2] = f[0] + f[1];
32                     if (f[2] == C)
33                     {
34                         flag = 1;
35                         break;
36                     }
37                     if (f[2] >= INF)
38                         break;
39                 }
40                 printf("%s\n", flag ? "Yes" : "No");
41             }
42         }
43     }
44     return 0;
45 }

 

转载于:https://www.cnblogs.com/windysai/p/3982594.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值