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. npoi导入--从varchar数据类型到datetime数据类型转换产生一个超出范围的值问题

    一,导入问题如图: 二,解决方法和原因: 1,经过调试发现导入获取到的日期数据被装换成1/1/10 0:00,如下图: 而将以上的数据插入数据库类型为datatime的列时会报错 2,经过去了解npo ...

  2. 基于DDD的.NET项目搭建

    第一次写博客有点小激动,废话不多说先上图: 01_Client:存放UI相关的项目,比如ASP.NET MVC或者相关的Web Model及View Model项目. 02_Hosting:存放与Se ...

  3. java 访问后台方法顺序混乱

    今天遇到后台接值顺序混乱的问题. 环境:前台ajax请求后台方法.前台页面会频繁访问这个ajax. 现象:访问后台方法的顺序混乱. 怎么发现的问题:数量小访问没有问题,今天压力测试发现的问题. 解决办 ...

  4. UIKit

    UIAlertView UIAlertView 调用创建好对象的[testObject show]的show方法即可弹出UIAlertView UILabel UILabel常见属性 text:显示文 ...

  5. java知识点梳理

    网络搜索结果,出处不详,仅供参考 对于刚刚接触Java的人,java基础知识技术点繁多,那么gkstk小编为大家汇总最全java知识点如下,仅供大家参考学习! 1. JVM相关(包括了各个版本的特性) ...

  6. IIS添加服务

    最近心血来潮,想学习一下WCF,看着网上的一个小例子就开始动手了. 写了一个简单的服务,准备发布时,才发现很多问题,根本不能像网上的那些大神一样“易得”. 其中遇到的一个的典型问题,就是提示为下载的文 ...

  7. Java中的Class类

    Class 类是在Java语言中定义一个特定类的实现.一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类.Class类的对象用于表示当前运行的 Java 应用程序中的类和接口. ...

  8. Func,Action 的介绍

    Func,Action 的介绍 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中 ...

  9. 初始化git

    git config --global user.name "Firstname Lastname" git config --global user.email "yo ...

  10. springmvc获取jar中的静态资源与jar包中的资源互相引用问题

    1.首先看jar中的文件位置 2.在web工程中引用该jar 并且在springmvc文件中配置路径 如果有多个路径可用逗号隔开 3.在web工程找jsp页面如何引用 这样就可以了 关于jar中的资源 ...