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. ng动态显示和隐藏

    <!DOCTYPE html><html><head><meta charset="utf-8"><script src=&q ...

  2. JAVA上连接ubuntu14.04上的Hbase

    对于新手来说,连接虚拟机上的Hbase有点繁琐,而且网上的配置不太适合初学者,今天我就整理了一下,希望对你们有帮助,第一次发博客. 1.首先去官网下载Hbase的压缩包.我这里用的是1.2.1 htt ...

  3. equals和hashcode为什么要一起重写

    equals()方法与hashCode()的通用协定是:2.1 如果两个对象相等(equal),那么必须拥有相同的哈希码(hash code)2.2 即使两个对象有相同的哈希值(hash code), ...

  4. 开学&东大一周游记

    明天就要离开生活但并没有学到多少东西的东大了,不舍,这是真的,因为真的是没学到多少就要走了.但是终归是有收获的,比如感受到了舍长这样的大牛的学习态度,东大的浴池真的很棒,我很感激吉大的伙食诸如此类.感 ...

  5. CODE[VS]-求和-整数处理-天梯青铜

    题目描述 Description 求n个数的和 输入描述 Input Description 第一行一个整数n 接下来一行n个整数 输出描述 Output Description 所有数的和 样例输入 ...

  6. Defraggler(磁盘整理软件) V2.21.993 绿色版

    软件名称: Defraggler(磁盘整理软件) 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 5.0MB 图片预览: 软件简介: Defraggler ...

  7. JTable

    final Table table = new Table(parent, SWT.NONE | SWT.FULL_SELECTION); final GridData gd = new GridDa ...

  8. 第33届 MPD软件工作坊(南京站)有哪些亮点值得我们参加?

    MPD软件工作坊由msup2010年创办,自创办以来,共吸引了万名的软件从业者到场参与.第33届 MPD软件工作坊(南京站)将于12月17-18日在南京召开,大会报名平台:活动家! 快捷报名通道:ht ...

  9. ListBox 如何改变某行的字体颜色

    Option Explicit Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Pri ...

  10. Topself 方便调试的Window服务框架

    Installing Topshelf nuget Install-Package Topshelf public class TownCrier { readonly Timer _timer; p ...