ZOJ 1962 How Many Fibs?

来源:互联网 发布:淘宝宝贝隐形降权查询 编辑:程序博客网 时间:2024/06/18 15:04

首先预处理求出100位以内的所有fibonacci数,然后找范围.

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;char fib[481][103]  = {"1","2",NULL};int f1[105],f2[105],res[205], n;char a[105], b[105];int charToInt(int buf[], char src[]){memset(buf, 0, sizeof(buf));int len = strlen(src);for(int i = 0; i < len; ++i){buf[i] = src[i] - '0';}return len;}int intToChar(char buf[], int src[], int len){memset(buf, 0, sizeof(buf));for(int i = 0; i < len; ++i){buf[i] = src[i] + '0';}return len;}int bigNumAdd(char s1[], char s2[]){int l1 = strlen(s1), l2 = strlen(s2);charToInt(f1, s1), charToInt(f2, s2);int b = max(l1, l2);memset(res, 0, sizeof(res));for(int i = 0; i < b; ++i){res[i] = f1[i] + f2[i];}int len = b;for(int i = 0; i < b; ++i){if(res[i] >= 10){res[i + 1] += res[i] / 10;res[i] %= 10;len = max(i + 2, len);}}return len;}void init(){n = 2;int len = 0;for(; len < 101; ++n){len = bigNumAdd(fib[n - 2], fib[n - 1]);intToChar(fib[n], res, len);};for(int i = 0; i < n; ++i){int len = strlen(fib[i]);reverse(fib[i], fib[i] + len);}}bool cmp(const char * s1, const char * s2){int l1 = strlen(s1), l2 = strlen(s2);return l1 < l2 || (l1 == l2 && strcmp(s1, s2) < 0);}int main(){init();while(scanf("%s %s", a, b)){if(!strcmp(a, "0") && !strcmp(b, "0"))break;int p1 = lower_bound(fib, fib + n, a, cmp) - fib;int p2 = upper_bound(fib, fib + n, b, cmp) - fib;printf("%d\n", p2 - p1);}return 0;}


原创粉丝点击