问题 : 来简单地数个数(大数模拟计算斐波那契数+区间数数)

题目描述

这是一个斐波那契数列:

f1 = 1

f2 = 2

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

蔡老板想知道,给你两个数 a、b,你能否求出在区间[a,b]里有多少个斐波那契数。

输入

多组数据输入。一行为一组输入数据,包括两个非负整数 a、b(a <= b <= 10^100),当a=b=0 时输入终止。

输出

对每组输入,输出单独一行,包含一个整数表示区间[a,b]里的斐波那契数个数。

样例输入

10 100
1234567890 9876543210
0 0

样例输出

5
4
  1 /*
  2 问题  输入两个数a和b,表示一个区间(a <= b <= 10^100),问之间有多少个斐波那契数
  3 解题思路 由于数据范围很大,所以要先将最大范围内的斐波那契数用大整数加法模拟出来,用字符串存储,再在该区间内
  4 找到符合条件的数的个数
  5
  6 易错
  7 第一个数是1,如果数组从0开始存的话,第一个斐波那契数是0,不是1,记住wa了九遍的原因。
  8 */
  9 #include<cstdio>
 10 #include<cstring>
 11 #include<iostream>
 12 using namespace std;
 13 char f[600][200];
 14
 15 void strsum(char sum[],char a[],char b[]);
 16 int mycmp(char a[],char b[]);
 17 void srev(char str[]);
 18
 19 int main()
 20 {
 21     strcpy(f[0],"1");//按照题目中说的第一个数为1,所以计数的时候千万要看清
 22     strcpy(f[1],"2");
 23     int i,j;
 24     for(i=2;i<600;i++){
 25         strsum(f[i],f[i-1],f[i-2]);
 26     }
 27     /*for(i=0;i<500;i++){
 28             cout<<i<<endl;
 29             printf("%s\n",f[i]);
 30     }*/
 31     char a[200],b[200];
 32     while(1){
 33         scanf("%s%s",a,b);
 34         if(strcmp(a,"0")==0 && strcmp(b,"0")==0)
 35                 break;
 36
 37         int k,ans=0;
 38         for(k=0;k<500;k++){
 39             if(mycmp(f[k],a) >= 0 && mycmp(b,f[k]) >= 0){
 40                 //puts(f[k]);
 41                 ans++;
 42             }
 43         }
 44         printf("%d\n",ans);
 45     }
 46     return 0;
 47 }
 48
 49 void srev(char str[])
 50 {
 51     int strl=strlen(str);
 52     char s2[200];
 53     int i,j=0;
 54     for(i=strl-1;i>=0;i--){
 55         s2[j++]=str[i];
 56     }
 57     for(i=0;i<strl;i++){
 58         str[i]=s2[i];
 59     }
 60     str[i]=‘\0‘;
 61 }
 62
 63 int mycmp(char a[],char b[])
 64 {
 65     int al=strlen(a),bl=strlen(b);
 66     if(al != bl){
 67         if(al > bl)
 68             return 1;
 69         else
 70             return -1;
 71     }
 72     else
 73     {
 74         int ans=strcmp(a,b);
 75         if(ans > 0)
 76             return 1;
 77         else if(ans == 0)
 78             return 0;
 79         else
 80             return -1;
 81     }
 82 }
 83
 84 void strsum(char strsum[],char a[],char b[])
 85 {
 86     int al=strlen(a),bl=strlen(b);
 87     srev(a);
 88     srev(b);
 89     int digsum[200]={0},i,j;
 90     for(i=0;i<al && i<bl;i++){
 91         digsum[i] = (a[i] - ‘0‘)+(b[i] - ‘0‘);
 92     }
 93
 94     j=i;
 95     if(j < al){
 96         for(;j<al;j++){
 97             digsum[j] = (a[j] - ‘0‘);
 98         }
 99     }
100     j=i;
101     if(j < bl){
102         for(;j<bl;j++){
103             digsum[j] = (b[j] - ‘0‘);
104         }
105     }
106
107     int suml=al > bl?al:bl;
108     for(i=0;i<suml;i++){
109         if(digsum[i] > 9){
110             digsum[i+1] ++;
111             digsum[i] %= 10;
112         }
113     }
114     if(digsum[suml] != 0)
115         suml++;
116     j=0;
117     for(i=suml-1;i>=0;i--){
118         strsum[j++] = digsum[i] + ‘0‘;
119         //printf("%d",digsum[i]);
120     }
121     strsum[j]=‘\0‘;
122     //printf("\n");
123     srev(a);
124     srev(b);
125 }

原文地址:https://www.cnblogs.com/wenzhixin/p/8881571.html

时间: 2024-10-17 15:55:32

问题 : 来简单地数个数(大数模拟计算斐波那契数+区间数数)的相关文章

17. 计算斐波那契数(非递归方法)

题目: 编写非递归函数计算斐波那契数 Fn .对于每一个斐波那契数,你的代码应该只计算一次.测试你的代码. 思路: 非递归算法,要从正向进行迭代计算.我们统一一下定义:数列从 1 开始,即F(1) = 1, F(2) = 1. 利用三个变量:fib_front,fib_behind, fib.顾名思义,fib_front代表靠前的一个数,fib_behind代表靠后的一个数, fib代表当前的数.每次循环,将靠后的数值给靠前的那个,再将当前数的值给靠后的那个,这样就完成了一次迭代. 代码: 1

给定斐波那契数列的项数求对应的数值的普通方法和优化处理

1 /** 2 给定斐波那契数列的项数求对应的数值 3 参考:剑指Offer 4 */ 5 #include <stdio.h> 6 7 int fib(int n); 8 long long fibonacci(unsigned int n); 9 int main(int argc, const char * argv[]) { 10 11 int n; 12 13 while (1) { 14 15 printf("请输入你想知道到的斐波那契数列的项数:\t"); 1

用大数加法实现斐波那契数列

E - Edge Case F[3]=4; F[4]=7; F[5]=11; 依次类推,求[3,2000]的斐波那契数 #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> using namespace std; int n; int F[10001][2500]; int main() { memset(F, 0,

hdu1316(大数的斐波那契数)

题目信息:求两个大数之间的斐波那契数的个数(C++/JAVA) http://acm.hdu.edu.cn/showproblem.php?pid=1316 这里给出java代码和c++代码 C++:AC代码 #include<iostream> #include<string> using namespace std; string add(string s1,string s2){//字符串模拟大数加法 string s; int len1,len2; len1=s1.size

斐波那契数与二分法的递归与非递归算法及其复杂度分析

1. 什么是斐波那契数? 这里我借用百度百科上的解释:斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加.特别指出:0不是第一

HDU 1316 (斐波那契数列,大数相加,大数比较大小)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1316 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 c

ACM_无聊者序列(斐波那契数列大数+同余+规律)

Problem Description: 瓜瓜在玩着由红色和蓝色的大理石做成的玻璃珠,他将n个玻璃珠从左到右排成一个序列叫做无聊者序列.一个非空的红色和蓝色玻璃珠组成的序列是一个无聊者序列.这个序列的玻璃珠颜色是交替的,例如:序列(红色:蓝色:红色)和(蓝色)是一个无聊者序列.(红色:红色)不是无聊者序列.现在,瓜瓜想知道,从这个序列中选出一个无聊者子序列有多少种方法.并将它mod(1000000007). Input: 输入有多组数据,输入一个整数n(1 <= n <= 10^6),代表这个

算法笔记_001:斐波那契数的多种解法

本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第几个斐波那契数.(Java: 231-1 for int, 263-1 for long) 解决方案:针对问题1,此处要使用迭代法来解决,具体实现代码如下: //用迭代法寻找编程环境支持的最大整数(int型)的斐波那契数是第几个斐波那契数 public static int max_int_iter

用for循环和递归调用写出1~N的斐波那契数列的和 和第N位的数

首先注意: 代码是从上往下,从左往右执行的!! 这是for循环写的 m=任意数.代表1~多少位的和 public class Fei_Bo_Na_Qi{    public static void main(String[] args){        int m = 30;  //这里代表1~30位的和        System.out.println( "斐波那契数列的第 "+m+" 位数为: "+m1(m) );//  在输出的时候调用函数    }