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. Ubuntu中Qt新建窗体提示lGL错误

    提示错误: cannot find -lGL collect2:error:ld returned 1 exit status 这是因为系统缺少链接库,终端输入: sudo apt-get insta ...

  2. 又遇Release编译的一坑 -- 应用程序正常初始化(0xc000007b)失败。请单击“确定”,终止应用程序。

    项目中使用了xlslib库,以动态库形式编译,由于它没有生成链接库lib文件,所以官方提供的demo中有createDLL这个小程序用来生成lib文件.然而我又 no zuo no die了一次.   ...

  3. SQL总结之创建实例表空间监听

    [创建数据库实例]cmd------>dbca[创建表空间-sql创建]create tablespace NSTC_WS logging datafile 'D:\app\dell\orada ...

  4. 四位len灯流水

    #include <msp430x14x.h> //#include<intrins.h> #define uint unsigned int void delay(long ...

  5. C++内存池

    内存池是一种内存分配方式.通常我们习惯直接使用new.malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片.并由于频繁的分配和回收内存会降低 ...

  6. ECOS-Mongodb安装

    安装Mongodb服务 安装Mongodb服务 author :James,jimingsong@vip.qq.com since :2015-03-03 下载Mongodb安装包(64位哦) 安装M ...

  7. java学习记录

    1,接口(不实现任何方法)——>抽象类(实现部分公共方法)——>简单实现类——>具体实现类 2,抽象类不能被直接实例化,只能实现抽象方法,以匿名内部类的方式表现. 3,如果stati ...

  8. JQuery笔记(一)jq的使用方法

    我用的jq版本是支持pc版为主的最高1版本里最高的1.124版本 官网的链接是只有最新的3下载,我把我在官网下载的jq代码链接发出来,如下 点我获取jq代码 和js不同的是,jq开发者封装了一些方法 ...

  9. .net MVC 中“MvcPager” 插件的简单使用。

    .net MVC 中提供了一个分页组件"MvcPager",用起来还算方便,实用性较强. 简单写一下使用方法,如有不足的地方,请各位大大给小弟指正出来. 一.准备工作 使用这个组件 ...

  10. iis无法加载样式