Hat's Fibonacci

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 12284    Accepted Submission(s): 4124

Problem Description

A Fibonacci sequence is calculated by adding the previous two members the sequence, with the first two members being both 1.

F(1) = 1, F(2) = 1, F(3) = 1,F(4) = 1, F(n>4) = F(n - 1) + F(n-2) + F(n-3) + F(n-4)

Your task is to take a number as input, and print that Fibonacci number.

Input

Each line will contain an integers. Process to end of file.

Output

For each case, output the result in a line.

Sample Input

100

Sample Output

4203968145672990846840663646

Note:No generated Fibonacci number in excess of 2005 digits will be in the test data, ie. F(20) = 66526 has 5 digits.

用string会超时,以下为超时代码。

#include <iostream>
#include <string>
using namespace std;
string add(string a,string b)
{
int len1=a.length();
int len2=b.length();
int i;
if(len1>len2)
{
for(i=;i<=len1-len2;i++)
b=""+b;
}
else
{
for(i=;i<=len2-len1;i++)
a=""+a;
}
string str;
int cf=,t;
len1=a.length();
for(i=len1-;i>=;i--)
{
t=a[i]-''+b[i]-''+cf;
cf=t/;
t%=;
str=char(t+'')+str;
}
if(cf!=)
str=char(cf+'')+str;
return str;
}
string fun(int n)
{
string f[];
f[]="";
f[]="";
f[]="";
f[]="";
int i;
string a,b,c;
for(i=;i<=n;i++)
{
a=add(f[i-],f[i-]);
b=add(f[i-],f[i-]);
f[i]=add(a,b);
}
return f[n];
}
int main()
{
int n;
while(cin>>n)
{
string str;
str=fun(n);
cout<<str<<endl;
cout<<endl;
}
return ;
}

正确的代码

方法一:
利用二维数组和亿进制。
#include<cstdio>
#include <iostream>
#include<cstring>
using namespace std;
int str[][]; //必须为int类型。
int main()
{
memset(str,,sizeof(str));
str[][]=;
str[][]=;
str[][]=;
str[][]=;
int i,j,ans=,c,n;
for(i=;i<;i++)
{
for(j=,c=;j<;j++) //循环,来将j个数组的8位数字的情况全部列举出。
{
ans=str[i-][j]+str[i-][j]+str[i-][j]+str[i-][j]+c;
c=ans/;
str[i][j]=ans%; //每一个数组存8位数字,c来判定是否进位。
}
}
while(cin>>n)
{
j=;
while(!str[n][j]) //首位有0,清除掉0。
j--;
cout<<str[n][j]; //开头的首0清除掉后的x位数字,可能小于8位。
for(i=j-;i>=;i--)
printf("%08d",str[n][i]); //每8位数字输出一组,不足的自动部0。
printf("\n");
}
return ;
}
方法二:
利用滚动数组求解
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; int t[][]; int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
memset(t,,sizeof(t));
t[][] = ;
t[][] = ;
t[][] = ;
t[][] = ;
for(int i = ;i < n;i++)
{
int carry = ;
int k = i % ;
for(int j = ;j < ;j++)
{
int x = t[][j] + t[][j] + t[][j] + t[][j];
t[k][j] = x + carry;
carry = t[k][j] / ;
t[k][j] %= ;
}
}
int k = ;
while(t[(n - ) % ][--k] == );
for(int i = k;i >= ;i--)
{
printf("%d",t[(n - ) % ][i]);
} printf("\n"); } return ;
}

用JAVA

import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner (System.in);
BigInteger a[]=new BigInteger[10001];
int n;
while(in.hasNextInt()) {
n=in.nextInt();
a[1]=BigInteger.ONE;
a[2]=BigInteger.ONE;
a[3]=BigInteger.ONE;
a[4]=BigInteger.ONE;
for(int i=5;i<=10000;i++) {
a[i]=BigInteger.ZERO;
a[i]=a[i].add(a[i-1]);
a[i]=a[i].add(a[i-2]);
a[i]=a[i].add(a[i-3]);
a[i]=a[i].add(a[i-4]);
}
System.out.println(a[n]);
}
}
}

(二维数组 亿进制 或 滚动数组) Hat's Fibonacci hdu1250的更多相关文章

  1. bugku——普通的二维码(进制转换)

    题目地址:http://ctf.bugku.com/files/5e480ecb178711e82bc847a208e15b32/misc80.zip 就一张二维码图片,用一些在线工具识别是乱码,用Q ...

  2. nyoj28 大数阶乘 亿进制优化

    思路:刚开始用的十进制模拟手算加法,超时了.然后想到刘汝佳大哥书上面用的亿进制能够加速大数运算,果然180ms过掉了. 亿进制与十进制相同,只不过是把八位看做一位,例如6464654654165,看成 ...

  3. php小算法总结一(数组重排,进制转换)

    1.两个有序数组组合成一个新的有序数组 <?php $arr1=array(2,5,7,9,12); $arr2=array(3,4,6,8,10,11); function merge_sor ...

  4. php小算法总结一(数组重排,进制转换,二分查找)

    1.两个有序数组组合成一个新的有序数组 <?php $arr1=array(2,5,7,9,12); $arr2=array(3,4,6,8,10,11); function merge_sor ...

  5. Android---16进制与字节数组

    16进制字符串与字节数组进行转换 package string; import java.util.Arrays; /** * byte[]与16进制字符串相互转换 * * @date:2017年4月 ...

  6. 数据结构之【栈】+十进制转d进制(堆栈数组模拟)

    其实这篇文章开出来主要是水文章%% %% 栈--后进先出的婊 特点:只能在某一端插入和删除的特殊的线性表 操作:进栈--PUSH->向栈顶插入元素 出栈--POP-->将栈顶元素删除 实现 ...

  7. ThoughtWorks.QRCode 生成QR二维码时提示“索引超出了数组界限”的原因和解决方法

    "索引超出了数组界限"也有可能确实是因为你选择的二维码Version对应的容量不足以存储你所放的内容,如果你确定使用的版本容量二维码能存储你的内容,但还是报错,那么再考虑此解决方法 ...

  8. C# 进制转换 在什么情况下使用16进制,字节数组,字符串

    C# 进制转换 Admin2013年9月18日 名人名言:从工作里爱了生命,就是通彻了生命最深的秘密.——纪伯伦 1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Con ...

  9. C# 校验并转换 16 进制字符串到字节数组

    问题 最近在进行硬件上位机开发的时候,经常会遇到将 16 进制字符串转换为 byte[] 的情况,除了这种需求以外,还需要判定一个字符串是否是有效的 16 进制数据. 解决 字符串转 byte[] 的 ...

随机推荐

  1. 20135327--linux内核分析 实践二

    内核模块编译 1.实验原理 Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容都集成在一起,效率很高,但可扩展性 ...

  2. 使用msysgit上传项目到github

    综合这几个教程,终于提价了项目,总结一下流程. (教程1[github入门教程]:http://jingpin.jikexueyuan.com/article/1037.html) (教程2[常见错误 ...

  3. 第三个Sprint冲刺第九天(燃尽图)

  4. ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression笔记

    前言 致力于滤波器的剪枝,论文的方法不改变原始网络的结构.论文的方法是基于下一层的统计信息来进行剪枝,这是区别已有方法的. VGG-16上可以减少3.31FLOPs和16.63倍的压缩,top-5的准 ...

  5. Spring使用Cache、整合Ehcache(转)

    今天在做Spring使用Cache.整合Ehcache时发现一篇非常好的文章,原文地址 http://elim.iteye.com/blog/2123030 从3.1开始,Spring引入了对Cach ...

  6. 【转】GPS定位准确度CEP、RMS

    转自:http://blog.sina.com.cn/s/blog_70f96fda0101lcb9.html CEP和RMS是GPS的定位准确度(俗称精度)单位,是误差概率单位.就拿2.5M CEP ...

  7. MySQL存储和获取数据

    ---恢复内容开始--- 一.MySQL存储引擎? 1.引擎定义 存储引擎其实就是如何存取数据,如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系型数据苦中数据是以表格的形式,所 ...

  8. PAT 1002 写出这个数

    https://pintia.cn/problem-sets/994805260223102976/problems/994805324509200384 读入一个自然数n,计算其各位数字之和,用汉语 ...

  9. python 协程库gevent学习--gevent源码学习(二)

    在进行gevent源码学习一分析之后,我还对两个比较核心的问题抱有疑问: 1. gevent.Greenlet.join()以及他的list版本joinall()的原理和使用. 2. 关于在使用mon ...

  10. Linux基础学习(4)--Linux常用命令

    第四章——Linux常用命令 一.文件处理命令 1.命令格式与目录处理命令ls: (1)命令格式:命令 [-选项] [参数]   例:ls -la /etc (2)说明:个别命令使用不遵循此格式;当有 ...