ACM复习(8)1143 多少个Fibonacci数
2017-11-01 20:35
477 查看
Description
给你如下Fibonacci 数的定义:
F1 = 1
F2 = 2
Fn = Fn-1 + Fn-2 (n >= 3)
给你两个数a与b,现要求你计算在a与b之间(包括a、b)有多少个Fibonacci 数
输入格式
有多行,每行有两个数a、b,使用空格分隔,a <= b <= 10^100(即最大10的100次方)
最后一行为两个0
输出格式
除了最后一行,其它每一行要求输出在a与b之间的Fibonacci 数的个数,一行一个
输入样例
10 100
1234567890 9876543210
0 0
输出样例
5
4
这道题会不会也是呢?虽然范围确实很吓人。先试试吧,然后打了个表就过了。
先将前1000个Fibonacci数打出来,然后读取输入在表里对比,找到对应的坐标相减就是两个
Fibonacci数之间的Fibonacci数个数。
给你如下Fibonacci 数的定义:
F1 = 1
F2 = 2
Fn = Fn-1 + Fn-2 (n >= 3)
给你两个数a与b,现要求你计算在a与b之间(包括a、b)有多少个Fibonacci 数
输入格式
有多行,每行有两个数a、b,使用空格分隔,a <= b <= 10^100(即最大10的100次方)
最后一行为两个0
输出格式
除了最后一行,其它每一行要求输出在a与b之间的Fibonacci 数的个数,一行一个
输入样例
10 100
1234567890 9876543210
0 0
输出样例
5
4
解题思路
看到范围时还是有点懵的,怎么想都没有思路。后来突然想到大整数的题目很多都是打表的,这道题会不会也是呢?虽然范围确实很吓人。先试试吧,然后打了个表就过了。
先将前1000个Fibonacci数打出来,然后读取输入在表里对比,找到对应的坐标相减就是两个
Fibonacci数之间的Fibonacci数个数。
#include<iostream> #include<string> using namespace std; // 存放fibonacci数的表 string fb[1002]; int getIndex(string &s, int mode); void calculate(int n, int m); int main() { string a, b; int indexa, indexb; fb[1] = "1"; fb[2] = "2"; // 打表 for(int i = 1; i < 1000; i ++) calculate(i, i + 1); while(cin>> a && cin >> b && b[0] != '0') { indexa = getIndex(a, 1); indexb = getIndex(b, 2); cout << indexb - indexa + 1 << endl; } return 0; } int getIndex(string &s, int mode) { if(mode == 1) { for(int i = 1; i < 1001; i ++) { if(s.length() < fb[i].length()) return i; else if(s.length() == fb[i].length()) { if(s <= fb[i]) return i; } } } else { for(int i = 1; i < 1001; i ++) { if(s.length() < fb[i].length()) return i - 1; else if(s.length() == fb[i].length()) { if(s < fb[i]) return i - 1; else if(s == fb[i]) return i; } } } } // 大整数加法 void calculate(int n, int m) { int index = m + 1; int max = fb[m].length(); string a(fb .rbegin(), fb .rend()); string b(fb[m].rbegin(), fb[m].rend()); string c; // 高位补0对齐 for(int i = 0; i < fb[m].length() - fb .length(); i ++) a.append(1, '0'); int e, t, k; e = t = 0; for(int i = 0; i < max; i ++) { k = a[i] - '0' + b[i] - '0' + e; t = k % 10; e = k / 10; c.append(1, t + '0'); } if(e == 1) c.append(1, '1'); k = c.length(); for(int i = 1; i <= k; i++) fb[index].append(1, c[k - i]); }
相关文章推荐
- 1143 多少个Fibonacci数
- ACM复习(36)9521 射了多少 II
- ACM复习(30)9505 射了多少
- 【HDU5898 2016 ACM ICPC Asia Regional Shenyang Online G】【数位DP】odd-even number 范围内有多少数字满足奇串长为偶数偶串长为奇数.
- [ACM] FZU 2087 统计数边 (有多少边至少存在一个最小生成树里面)
- [ACM] hdu 1848 Fibonacci again and again(Nim博弈 SG函数)
- ACM_数论_阶乘N!的末尾有几个零 和 末尾有多少个 1 nyoj 954
- HDOJ HDU 2078 复习时间 ACM 2078 IN HDU
- 2015 acm icpc asia regional changchun 队内 模拟 + 背包复习 +Tire树
- acm-C++经典程序训练---斐波那契(Fibonacci)数列
- [ACM] hdu 1848 Fibonacci again and again(Nim博弈 SG函数)
- ACM(013)Fibonacci(斐波那契)数(1)
- ACM复习(43)10674 等差对
- 杭电ACM 五 另一种Fibonacci
- [ACM] hdu 1848 Fibonacci again and again(Nim博弈 SG函数)
- ACM复习(27)8633 回文划分
- ACM复习(35)9513 防空洞
- Fibonacci数 南阳理工ACM 题目13
- ACM复习(11)8615 快乐
- http://acm.hdu.edu.cn/showproblem.php?pid=2492&&求长度为3的顺序序列有多少个