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. 关于【IE兼容】的都在这

    滚动条 ie的滚动条覆盖了内容,为了触屏操作优化浏览器的内容显示,IE 浏览器提供了一种可以浮动显示,自动隐藏的滚动条样式,但是这个样式会在某些情况下造成一些困扰,比如下图... 其实默认情况下,桌面 ...

  2. fiddler还是浏览器的问题

    当我在浏览器里输入http://localhost/infomanage/price?cityid=1&cateid=246&timer=3 后端接收的参数是timer的时候,浏览器会 ...

  3. bootstrap IE8 相互兼容

    针对 IE8 仍然需要额外引入 Respond.js 文件(由于仍然利用了浏览器对媒体查询(media query)的支持,因此还需要做处理) <html lang="zh-cn&qu ...

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

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

  5. Unity3DGUI:鼠标click

    Input函数监测鼠标操作 鼠标点击事件 鼠标双击事件

  6. asp.net时间范围查询

    1.首先要查询类表中的一个时间段,要明确我的数据库中只有一个时间字段,我们先将他拆分一下. if ($("#news_OpenTime").val() != "" ...

  7. java 的对象拷贝(有深浅拷贝两种方式,深拷贝实现的两种方式(逐层实现cloneable接口,序列化的方式来实现))

    Java提高篇--对象克隆(复制)(转自:http://www.cnblogs.com/Qian123/p/5710533.html#_label0)   阅读目录 为什么要克隆? 如何实现克隆 浅克 ...

  8. ios 关于tableview小技巧

    第一个:cell中的分割线不顶头 首先在viewDidLoad方法加入以下代码: if ([self.tableView respondsToSelector:@selector(setSeparat ...

  9. js输入框对金额的匹配

    /** * 金额格式化 * @param s * @param n * @returns {String} */ function fmoney(s, n) { n = n > 0 && ...

  10. js 冒泡排序

    var arr = []; for(var i=0; i<100000; i++){ arr.push(parseInt(Math.random()*100)) }; var t1 = Date ...