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. 基于bootstrap表单登录(带验证码)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!-- ...

  2. Linux内核分析第八周总结

    第八章 进程的切换和系统的一般执行过程 进程调度与进程调度的时机分析 第一种分类: I/O密集型(I/O-bound):频繁的进行I/O,通常会花费很多时间等待I/O操作的完成 CPU密集型(CPU- ...

  3. 【Deep Hash】CNNH

    [AAAI 2014] Supervised Hashing via Image Representation Learning [paper] [code] Rongkai Xia , Yan Pa ...

  4. <面向对象程序设计>课程作业一

    Github链接 在看完这次的作业要求后我整个人是混乱的,因为作业要求把不同的函数放在一个main函数中:我们之前也是进行了函数分离,但是是放在了不同的文件中.如果要改的话相当于重写(而且这两种形式其 ...

  5. PAT 1033 旧键盘打字

    https://pintia.cn/problem-sets/994805260223102976/problems/994805288530460672 旧键盘上坏了几个键,于是在敲一段文字的时候, ...

  6. What Is Apache Hadoop

    What Is Apache Hadoop? The Apache™ Hadoop® project develops open-source software for reliable, scala ...

  7. mysql 和php 保留2位小数

    一般交易中保留的数字的小数位数为2位(即最小单位为 1分钱[0.01元]) 数据库设计中预金钱有关或要求精准度要高的用 decimal(n,m) 表示,n表示保留的数字长度,保留的小数位数,如deci ...

  8. 软件工程_9th weeks

    PSP DATE START_TIME END_TIME EVENT TYPE       TIME 4.30-5.3 5:30 4:00 旅游 娱乐       72h 5.3 14:00 17:0 ...

  9. 软件工程_6th weeks

    一.上次博客时说的UI,拖拉到现在才展示,完成了“登录,普通匹配,做题界面,做题结果”四项 功能: 二.单元测试工具 1.python单元测试工具   最近因为论文原因一直在用Python,Pytho ...

  10. python模块_re模块

    正则表达式笔记'''#re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none.#re.search 扫描整个字符串并返回第一个成功的匹配#fi ...