hdu 1316 How Many Fibs?
2015-08-13 21:00
357 查看
点击即可传送到1316
题目大意:给你两个数a和b,求a和b之间有几个斐波那契数,包括a和b
解题思路:因为本题是一个很大的数,所以就用字符串,然后再加一个二分就好了。。。。
请看代码:
[code] **How Many Fibs?** Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5366 Accepted Submission(s): 2088 Problem Description Recall the definition of the Fibonacci numbers: f1 := 1 f2 := 2 fn := fn-1 + fn-2 (n >= 3) Given two numbers a and b, calculate how many Fibonacci numbers are in the range [a, b]. Input The input contains several test cases. Each test case consists of two non-negative integer numbers a and b. Input is terminated by a = b = 0. Otherwise, a <= b <= 10^100. The numbers a and b are given with no superfluous leading zeros. Output For each test case output on a single line the number of Fibonacci numbers fi with a <= fi <= b. Sample Input 10 100 1234567890 9876543210 0 0 Sample Output 5 4
题目大意:给你两个数a和b,求a和b之间有几个斐波那契数,包括a和b
解题思路:因为本题是一个很大的数,所以就用字符串,然后再加一个二分就好了。。。。
请看代码:
[code]/* 2015 - 8 - 13 下午 Author: ITAK 今日的我要超越昨日的我,明日的我要胜过今日的我, 以创作出更好的代码为目标,不断地超越自己。 */ #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 105; char data[1000][N+2]; char a[N+2],b[N+2]; int cmp(char *s1, char *s2) { for(int i=0; i<=N; i++) { if(i == N) return s1[i] - s2[i]; if(s1[i] != s2[i]) return s1[i] - s2[i]; } } int Find_up(int i, char *x) { int low=0, high=i; while(low <= high) { int mid = (high+low)/2; int val = cmp(x, data[mid]); if(val > 0) low = mid + 1; if(val == 0) return mid - 1; if(val < 0) high = mid - 1; } return high; } int Find_down(int i, char *x) { int low=0, high=i; while(low <= high) { int mid = (high+low)/2; int val = cmp(x, data[mid]); if(val > 0) low = mid + 1; if(val == 0) return mid + 1; if(val < 0) high = mid - 1; } return low; } int main() { data[0][105] = 1; data[1][105] = 2; int i = 2; int p = 105; while(data[i-1][5] <= 1) { for(int j=105; j>=p; j--) data[i][j] = data[i-1][j] + data[i-2][j]; for(int j=105; j>=p; j--) { int c = data[i][j]/10; if(c > 0) { data[i][j] %= 10; data[i][j-1] += c; } } if(data[i][p-1] > 0) p--; i++; } while(~scanf("%s%s",a,b)) { if(a[0]=='0' && b[0]=='0') break; int lena = strlen(a)-1; int lenb = strlen(b)-1; int k; for(int d=lena,k=N; d>=0; d--,k--) { a[k] = a[d] - '0'; a[d] = 0; } for(int d=lenb,k=N; d>=0; d--,k--) { b[k] = b[d] - '0'; b[d] = 0; } int L = Find_up(i-1, a); int R = Find_down(i-1, b); printf("%d\n",R-L-1); memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); } return 0; }
相关文章推荐
- Laravel 5 基础教程 || 2.路由:链接与控制器的连接者 - 表严肃
- nyoj32 组合数【DFS】
- Android-应用开发-网络编程(四)
- C#判断对象相等
- UDP协议
- Laravel 5基础教程 || 1.安装与部署 - 表严肃
- 黑马程序员-----------C语言基础-----------循环结构
- linux驱动开发中断例程学习
- zoj 2100 seeding(dfs)
- WebUploader API文档
- java.util.ConcurrentModificationException
- coj 1007:矩形着色
- 美元现钞和现汇的区别
- AndroidManifest.xml文件详解(service)
- C语言文件操作 fopen, fclose, mkdir(打开关闭文件,建文件夹,判断文件是否存在可读或可写)
- CodeForces 510B 无向图找环的两种方法(搜索与并查集)
- HDU 1429--胜利大逃亡(续)【BFS && 状态压缩】
- HDU1069_Monkey and Banana【LCS】
- Oracle ASM注意事项
- c# 调用c++ 使用指针传递的时候