循环-小蜜蜂-斐波那契数列-大数加法
来源:互联网 发布:mac变色龙引导 编辑:程序博客网 时间:2024/05/21 05:56
【题】
小蜜蜂(选作)
一只小蜜蜂在如下图所示的蜂窝上爬行。它爬行时,只能从一个格爬到相邻的大号格子中。例如,从 1 号格子可以爬到 2 号或者 3 号格子,从 2 号则可以爬到 3 号或者 4 号格子。
请问从一个格子 a 爬到一个格子 b 一共有多少种可行的路线。
输入:
分别是起始点 a 和终止点 b 的编号。( a 和 b 在 1~100 之间,且 a<b 。)
输出:
方案数量。
- 1 4↵
- 3↵
- 1 5↵
- 5↵
- 1 50↵
- 12586269025↵
- 2 50↵
- 7778742049↵
- 1 100↵
- 354224848179261915075↵
【分析】
分析可知,这是一个斐波那契数列。需要注意的是,C语言中所有的类型都不能表示题中的数值,需要用到大数加法。
【代码】
(1)先给出斐波那契数列的求法:
#include "stdio.h"int main(){int a, b;scanf("%d %d", &a, &b);getchar();int count = b - a;int i, x1 = 0, x2 = 1, y;//斐波那契数列for(i = 1; i <= count; i++){y = x1 + x2;x1 = x2;x2 = y;}printf("%d\n", y); return 0; }
(2)大数加法
#include "stdio.h"#include "stdlib.h"#define N 22//22位能表示第100个以内的斐波那契数列值char * Add(char * x1, char * x2);void Output(char * y);int main(){int i;//y = x1 + x2;char * x1 = (char *)malloc(sizeof(char) * N);char * x2 = (char *)malloc(sizeof(char) * N);char * y = (char *)malloc(sizeof(char) * N);//初始化y, x1, x2for (i = 0; i < N; i++){x1[i] = '\0';x2[i] = '\0';y[i] = '\0';}//给x1和x2赋初值//x1 = 1256//x2 = 567x1[0] = '6';x1[1] = '5';x1[2] = '2';x1[3] = '1';x2[0] = '7';x2[1] = '6';x2[2] = '5';y = Add(x1, x2);//输出Output(x1);printf(" + ");Output(x2);printf(" = ");Output(y);printf("\n"); return 0; }//大数加法函数char * Add(char * x1, char * x2){ char * y = (char *) malloc(sizeof(char *) * N);int i = 0;int t = 0;//表示进位//实现大数加法,数组前面存的是数值的高位。如123在数组中是{'3','2','1','\0'}//处理相同长度的部分while(x1[i] != '\0' && x2[i] != '\0'){y[i] = (x1[i] - '0' + x2[i] - '0' + t) % 10 + '0';t = (x1[i] - '0' + x2[i] - '0' + t) / 10;i++;}//如果x1比x2长while(x1[i] != '\0'){y[i] = (x1[i] - '0' + t) % 10 + '0';t = (x1[i] - '0' + t) / 10;i++;}//如果x2比x1长while(x2[i] != '\0'){y[i] = (x2[i] - '0' + t) % 10 + '0';t = (x2[i] - '0' + t) / 10;i++;}//如果还有进位if (t == 1){y[i++] = '1';}y[i] = '\0'; return y;}//输出void Output(char * y){//先找到\0的位置,然后逆序输出int i = 0;while(y[i] != '\0'){i++;}i--;while(i >= 0){printf("%d", y[i--] - '0');}}
(3)斐波那契数列 + 大数加法
#include "stdio.h"#include "stdlib.h"#define N 22//22位能表示第100个以内的斐波那契数列值char * Add(char * x1, char * x2);void Output(char * y);int main(){int a = 1, b = 100;scanf("%d %d", &a, &b);getchar();int count = b - a;int i;//y = x1 + x2;char * x1 = (char *)malloc(sizeof(char) * N);char * x2 = (char *)malloc(sizeof(char) * N);char * y = (char *)malloc(sizeof(char) * N);//初始化y, x1, x2for (i = 0; i < N; i++){x1[i] = '\0';x2[i] = '\0';y[i] = '\0';}//给x1和x2赋初值x1[0] = '0';x1[1] = '\0';x2[0] = '1';x2[1] = '\0';//斐波那契数列,叠加for(i = 1; i <= count; i++){y = Add(x1, x2);x1 = x2;x2 = y;}//输出结果Output(y);printf("\n"); return 0; }//大数加法函数char * Add(char * x1, char * x2){char * y = (char *) malloc(sizeof(char *) * N);int i = 0;int t = 0;//表示进位//实现大数加法,数组前面存的是数值的高位。如123在数组中是{'3','2','1','\0'}//处理相同长度的部分while(x1[i] != '\0' && x2[i] != '\0'){y[i] = (x1[i] - '0' + x2[i] - '0' + t) % 10 + '0';t = (x1[i] - '0' + x2[i] - '0' + t) / 10;i++;}//如果x1比x2长while(x1[i] != '\0'){y[i] = (x1[i] - '0' + t) % 10 + '0';t = (x1[i] - '0' + t) / 10;i++;}//如果x2比x1长while(x2[i] != '\0'){y[i] = (x2[i] - '0' + t) % 10 + '0';t = (x2[i] - '0' + t) / 10;i++;}//如果还有进位if (t == 1){y[i++] = '1';}y[i] = '\0';return y;}//输出void Output(char * y){//先找到\0的位置,然后逆序输出int i = 0;while(y[i] != '\0'){i++;}i--;while(i >= 0){printf("%d", y[i--] - '0');}}
- 循环-小蜜蜂-斐波那契数列-大数加法
- 斐波那契数列+大数加法
- 斐波那契数列大数加法
- 大数加法 + 斐波那契数列
- 斐波那契数列 大数加法hdu1316
- 用大数加法模板计算很大的斐波那契数列
- HDU 1865 1sting(大数斐波那契数列,模拟加法)
- HDU 1865 1sting 斐波那契数列 + 大数加法
- 大数斐波那契数列
- 斐波那契数列{大数问题}
- 大数斐波那契数列
- 大数相加+斐波那契数列
- java大数 斐波那契数列
- 斐波那契数列循环实现
- 斐波那契问题,基于大数加法
- hdu 2044 2501 一只小蜜蜂#DP#斐波那契#java水大数
- 杭电2044--一只小蜜蜂...--(递推求解)斐波那契数列应用
- hdu 2044一只小蜜蜂...(斐波那契数列)递推
- java获取时间的方法归纳
- [JQuery]JQuery中获取窗体宽度和高度的通用方法
- 线程同步技术(一)
- 实现只有0,1,2三种元素的乱序数组的排序
- 常见的基本算法总结(持续更新。。。)
- 循环-小蜜蜂-斐波那契数列-大数加法
- Castle AOP 系列(一):对类方法调用的拦截(有源码)
- ifconfig 配置ip,netmask,gw
- Oracl行列转换
- 评估期已过。有关如何升级的测试版软件的信息,请访问http://www.microsoft.com/sql/howtobuy
- android-PopupWindow弹出窗口 - 随心
- Ubuntu 中软件的安装、卸载以及查看的方法总结
- 线程同步技术(二)
- 跳台阶问题