http://poj.org/problem?id=2413

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//到第485个fib数才有100位
const int LAST=108;
char res[500][110]; //存储fib数
char *pos[500]; //存储每个fib数的首地址 char* Addition(char *a,char *b,char *sum)
{
int i,j,k,first;
//逆序开始,暂不处理进位
for(i=strlen(a)-1,j=LAST;i>=0;i--,j--)
sum[j]=a[i]-'0';
for(i=strlen(b)-1,k=LAST;i>=0;i--,k--)
sum[k]+=b[i]-'0';
//获取sum结果的首位位置
first=(j<k?j:k);
//处理进位
for(i=LAST;i>=first;i--)
{
sum[i-1]+=sum[i]/10;
sum[i]=sum[i]%10+'0';
}
//去除前导0
while(sum[first]=='0'&&first<LAST)
first++;
//返回sum的首位地址
return &sum[first];
} //计算fib数
void fib()
{
memset(res,0,sizeof(res));
memset(pos,NULL,sizeof(pos)); strcpy(res[1],"1");
strcpy(res[2],"2");
pos[1]=res[1];
pos[2]=res[2]; for(int i=3;i<485;i++)
pos[i]=Addition(pos[i-2],pos[i-1],res[i]);
} int cmp(char *a,char *b)
{
int lena=strlen(a),lenb=strlen(b);
if(lena==lenb)
return strcmp(a,b);
return lena>lenb?1:-1;
} int binarySearch(char *num,bool &flag)
{
int l=1,r=480;
while(l<=r)
{
int mid=(l+r)/2;
int res=cmp(num,pos[mid]);
if(res==0)
{
flag=true;
return mid;
}
else if(res<0)
r=mid-1;
else l=mid+1;
}
return l;
} int main()
{
fib();
char a[105],b[105];
while(scanf("%s %s",a,b)!=EOF)
{
if(strcmp(a,"0")==0&&strcmp(b,"0")==0)
break; bool flagL=false,flagR=false;
int l=binarySearch(a,flagL);
int r=binarySearch(b,flagR);
//返回值是[1,a)和[1,b)内的fib个数,所以若b也是fib数,输出时需+1 if(flagR)
printf("%d\n",r-l+1);
else printf("%d\n",r-l);
}
return 0;
}

POJ 2413 How many Fibs?#二分+大数加法的更多相关文章

  1. How many Fibs? POJ - 2413

    How many Fibs? POJ - 2413 高精模板 #include<cstdio> #include<cstring> #include<algorithm& ...

  2. 51nod 1005 大数加法

    #include<iostream> #include<string> using namespace std; #define MAXN 10001 },b[MAXN]={} ...

  3. c#大数加法

    在C#中,我们经常需要表示整数.但是,c#的基本数据类型中,最大的long也只能表示-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807之间的数 ...

  4. 玲珑杯1007-A 八进制大数加法(实现逻辑陷阱与题目套路)

    题目连接:http://www.ifrog.cc/acm/problem/1056 DESCRIPTION Two octal number integers a, b are given, and ...

  5. Leetcode 67 Add Binary 大数加法+字符串处理

    题意:两个二进制数相加,大数加法的变形 大数加法流程: 1.倒置两个大数,这一步能使所有大数对齐 2.逐位相加,同时进位 3.倒置两个大数的和作为输出 class Solution { public: ...

  6. HDU1002大数加法

    大数加法 c++版: #include <map> #include <set> #include <stack> #include <queue> # ...

  7. java实现大数加法、乘法(BigDecimal)

    之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...

  8. vector、string实现大数加法乘法

    理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将 ...

  9. 【大数加法】POJ-1503、NYOJ-103

    1503:Integer Inquiry 总时间限制:  1000ms 内存限制:  65536kB 描述 One of the first users of BIT's new supercompu ...

随机推荐

  1. vue.js之个人总结

    1.MVVM模式 MVVM模式(Model-View-ViewModel)的运作如下图: 1)上图解析:ViewModel是Vue.js的核心,它是一个Vue实例.Vue实例是作用于某一个HTML元素 ...

  2. python 数据聚合与分组

    前面讲完了字符处理,但对数据进行整体性的聚合运算以及分组操作也是数据分析的重要内容. 通过数据的聚合与分组,我们能更容易的发现隐藏在数据中的规律. 数据分组 数据的分组核心思想是:拆分-组织-合并 首 ...

  3. mysql的部分基础知识....

  4. Git提交到多个远程仓库

    在已经习惯使用git同步写代码,github无疑是最的托管平台,但是国内由于"你懂的"原因,速度很慢,有时无法访问,于是想把自己的代码同步到多个不同的远程仓库备份. 我的主要仓库: ...

  5. CentOS 手动增加、删除swap区

    SWAP是Linux中的虚拟内存,用于扩充物理内存不足而用来存储临时数据存在的.它类似于Windows中的虚拟内存.在Windows中,只可以使用文件来当作虚拟内存.而linux可以文件或者分区来当作 ...

  6. 【Time系列四】查询各月份的日历

    荒废了两个星期没学java了,今天一心想突破"日历查询"这个小程序.先用比较简单的python实现下. 无奈天资愚钝,想了一个上午.最后卡在了日期排列的问题上,只好去参考下别人的代 ...

  7. Git 常用命令 更新与提交

    整理了一下Git 常用命令,这个版本还是比较好用的,最后附上个人终结版,帮助你快速上手. 取得Git仓库 初始化一个版本仓库 git init Clone远程版本库 git clone yourgit ...

  8. 面向对象UML中类关系

    如果你确定两件对象之间是is-a的关系,那么此时你应该使用继承:比如菱形.圆形和方形都是形状的一种,那么他们都应该从形状类继承而不是聚合.如果你确定两件对象之间是has-a的关系,那么此时你应该使用聚 ...

  9. 修复ubunut桌面

    title: 修复ubunut桌面 tags: 桌面, ubuntu grammar_cjkRuby: true --- ,按下Ctrl+Alt+F2.这会让你进入一个命令行界面而不是默认的用户桌面界 ...

  10. UITableView优化方案

    1.UITableView的简单认识 > UITableView最核心的思想就是UITableViewCell的重用机制.简单的理解就是:UITableView只会创建一屏幕(或一屏幕多一点)的 ...