YT15-HDU-How many fibs(大数相加法)

Problem Description

Recall the definition of the Fibonacci numbers:

f1 := 1

f2 := 2

fn := fn-1 + fn-2 (n >= 3)

Given two numbers a and b, calculate how many Fibonacci numbers are in the range [a, b].

Input

The input contains several test cases. Each test case consists of two non-negative integer numbers a and b. Input is terminated by a = b = 0. Otherwise, a <= b <= 10^100. The numbers a and b are given with no superfluous leading
zeros.

Output

For each test case output on a single line the number of Fibonacci numbers fi with a <= fi <= b.

Sample Input

10 100
1234567890 9876543210
0 0

Sample Output

5
4

代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
string add(string x,string y)                            //大数相加法
{
    int i,temp,m=0;
    string Fib;
    int lenx=x.length();
    int leny=y.length();                                 //返回字符串x,y的长度
    if (lenx<leny)                                       //如果x比y短
    {
        for (i=1; i<=leny-lenx; i++)                     //在x前面补0至与y相同的长度
            x="0"+x;
    }
    else                                                 //反之
    {
        for (i=1; i<=lenx-leny; i++)                     //在y前面补0至与x相同的长度
            y="0"+y;
    }
    lenx = x.length();                                   //x长度发生变化,需要重新返回长度
    for (i=lenx-1; i>=0; i--)
    {
        temp=x[i]-'0'+y[i]-'0'+m;                        //相同位置的数字相加并加上后一位进的数
        m=temp/10;                                       //前一位将要加上m
        temp%=10;                                        //取余
        Fib=char (temp+'0')+Fib;                         //将这一位的数放进新的字符串
    }
    if (m!=0)
        Fib=char (m+'0')+Fib;                            //如果最高位的数大于10继续往前进
    return Fib;                                          //返回字符串
}
int main()
{
    string fibs[1005],a,b;
    int i;
    fibs[1]="1";
    fibs[2]="2";
    for (i=3; i<1005; i++)
    {
        fibs[i]=add(fibs[i-2],fibs[i-1]);                //将前1005个斐波那契数用数组统计。
    }
    while(cin >> a >> b)
    {
        if(a=="0" && b == "0")
            break;
        int head,end,len_a,len_b,len;
        len_a = a.length();                             //返回区间最小值的长度
        len_b = b.length();                             //返回区间最大值的长度
        //找到区间内最小的斐波那契数的位置
        for(i = 1; i<1005; i++)
        {
            len = fibs[i].length();                     //返回某一斐波那契数的长度
            if(len<len_a)
                continue;
            else if(len == len_a && fibs[i]>=a)         //长度相等时比较字符串的大小
            {
                head = i;
                break;
            }
            else if(len > len_a)
            {
                head = i;
                break;
            }
        }
        //找到区间内最大的斐波那契数的位置
        for(i = 1004; i>=1; i--)
        {
            len = fibs[i].length();
            if(len>len_b)
                continue;
            else if(len == len_b && fibs[i]<=b)
            {
                end = i;
                break;
            }
            else if(len < len_b)
            {
                end = i;
                break;
            }
        }
        cout<<end-head+1<<endl;                   //首尾相减+1
    }

    return 0;
}

运行结果:

时间: 2024-11-05 04:50:45

YT15-HDU-How many fibs(大数相加法)的相关文章

HDU 3925 Substring 【大数相减】

题目意思是,给你提供两个数字 a 和 b a 可以不断的往上加, 直到b 为其子串 问的是 a 最小加几? 显而易见,a  的数据范围给了10 ^100非常大,直接模拟肯定不行 那么就用 b 减去 a 来找,也算是一种模拟的方法 举个例子, a = 1299, b = 33 <1>33 330 3300 33000 (12)99 (1)299 1299  1299 ------ -------- --------     ------- 34 31 2001 32001 如果当前 b 比a的部

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆

剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具体的计算中,还是要将字符串转化成字符数组来进行计算. 实现两个大数的加法,要考虑到两个问题,两个数的和的位数问题,以及如何处理两个数按位相加产生的进位问题.首先两个整数相加,两个数的和的位数最多比最大的整数的位数多1:这样和的位数就确定了.对于进位问题,我的做法是先进行按位相加,相加操作完成后再按照

hdu acm-1047 Integer Inquiry(大数相加)

Integer Inquiry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11678    Accepted Submission(s): 2936 Problem Description One of the first users of BIT's new supercomputer was Chip Diller. He ex

华为机试—大数相减

题目:大数相减 输入两行字符串正整数,第一行是被减数,第二行是减数,输出第一行减去第二行的结果. 备注:1.两个整数都是正整数,被减数大于减数 示例: 输入:1000000000000001       1 输出:1000000000000000 #include <stdio.h> #include <string.h> #define MAX 100 //100位大数相减 int bigNumSub(char a[],char b[],char sub[]) { int i=0

[算法]大数相减

今天在小米OJ上看到一道题(https://code.mi.com/problem/list/view?id=3), 很有意思, 试着做了一下 描述: 两个长度超出常规整形变量上限的大数相减,请避免使用各语言内置大数处理库,如 Java.math.BigInteger 等. 输入: 有 N 行测试数据,每一行有两个代表整数的字符串 a 和 b,长度超过百位.规定 a>=b,a, b > 0. 测试结果可以用 linux 小工具 bc进行测试是否正确. 输出: 返回表示结果整数的字符串. 输入样

每日一练:#002大数相减

描述 两个长度超出常规整形变量上限的大数相减,请避免使用各语言内置大数处理库,如 Java.math.BigInteger 等. 输入 有 N 行测试数据,每一行有两个代表整数的字符串 a 和 b,长度超过百位.规定 a>=b,a, b > 0. 测试结果可以用 linux 小工具 bc进行测试是否正确. 输出 返回表示结果整数的字符串. 输入样例 1231231237812739878951331231231237812739878951331231231237812739878951331

L1-046 整除光棍 [大数相除]

写都写了,当大数相除模版吧 #include<iostream> #include<cstdio> #include<string.h> #include<string> #include<math.h> #include<map> #define maxn 10005 using namespace std; typedef long long ll; int n,p; string s; int ans[maxn]; bool j

抓起根本(二)(hdu 4554 叛逆的小明 hdu 1002 A + B Problem II,数字的转化(反转),大数的加法......)

数字的反转: 就是将数字倒着存下来而已.(*^__^*) 嘻嘻…… 大致思路:将数字一位一位取出来,存在一个数组里面,然后再将其变成数字,输出. 详见代码. 1 while (a) //将每位数字取出来,取完为止 2 { 3 num1[i]=a%10; //将每一个各位取出存在数组里面,实现了将数字反转 4 i++; //数组的变化 5 a/=10; 6 } 趁热打铁 例题:hdu 4554 叛逆的小明 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid