(二维数组 亿进制 或 滚动数组) Hat's Fibonacci hdu1250
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的更多相关文章
- bugku——普通的二维码(进制转换)
题目地址:http://ctf.bugku.com/files/5e480ecb178711e82bc847a208e15b32/misc80.zip 就一张二维码图片,用一些在线工具识别是乱码,用Q ...
- nyoj28 大数阶乘 亿进制优化
思路:刚开始用的十进制模拟手算加法,超时了.然后想到刘汝佳大哥书上面用的亿进制能够加速大数运算,果然180ms过掉了. 亿进制与十进制相同,只不过是把八位看做一位,例如6464654654165,看成 ...
- php小算法总结一(数组重排,进制转换)
1.两个有序数组组合成一个新的有序数组 <?php $arr1=array(2,5,7,9,12); $arr2=array(3,4,6,8,10,11); function merge_sor ...
- php小算法总结一(数组重排,进制转换,二分查找)
1.两个有序数组组合成一个新的有序数组 <?php $arr1=array(2,5,7,9,12); $arr2=array(3,4,6,8,10,11); function merge_sor ...
- Android---16进制与字节数组
16进制字符串与字节数组进行转换 package string; import java.util.Arrays; /** * byte[]与16进制字符串相互转换 * * @date:2017年4月 ...
- 数据结构之【栈】+十进制转d进制(堆栈数组模拟)
其实这篇文章开出来主要是水文章%% %% 栈--后进先出的婊 特点:只能在某一端插入和删除的特殊的线性表 操作:进栈--PUSH->向栈顶插入元素 出栈--POP-->将栈顶元素删除 实现 ...
- ThoughtWorks.QRCode 生成QR二维码时提示“索引超出了数组界限”的原因和解决方法
"索引超出了数组界限"也有可能确实是因为你选择的二维码Version对应的容量不足以存储你所放的内容,如果你确定使用的版本容量二维码能存储你的内容,但还是报错,那么再考虑此解决方法 ...
- C# 进制转换 在什么情况下使用16进制,字节数组,字符串
C# 进制转换 Admin2013年9月18日 名人名言:从工作里爱了生命,就是通彻了生命最深的秘密.——纪伯伦 1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Con ...
- C# 校验并转换 16 进制字符串到字节数组
问题 最近在进行硬件上位机开发的时候,经常会遇到将 16 进制字符串转换为 byte[] 的情况,除了这种需求以外,还需要判定一个字符串是否是有效的 16 进制数据. 解决 字符串转 byte[] 的 ...
随机推荐
- 基于bootstrap表单登录(带验证码)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <!-- ...
- Linux内核分析第八周总结
第八章 进程的切换和系统的一般执行过程 进程调度与进程调度的时机分析 第一种分类: I/O密集型(I/O-bound):频繁的进行I/O,通常会花费很多时间等待I/O操作的完成 CPU密集型(CPU- ...
- 【Deep Hash】CNNH
[AAAI 2014] Supervised Hashing via Image Representation Learning [paper] [code] Rongkai Xia , Yan Pa ...
- <面向对象程序设计>课程作业一
Github链接 在看完这次的作业要求后我整个人是混乱的,因为作业要求把不同的函数放在一个main函数中:我们之前也是进行了函数分离,但是是放在了不同的文件中.如果要改的话相当于重写(而且这两种形式其 ...
- PAT 1033 旧键盘打字
https://pintia.cn/problem-sets/994805260223102976/problems/994805288530460672 旧键盘上坏了几个键,于是在敲一段文字的时候, ...
- What Is Apache Hadoop
What Is Apache Hadoop? The Apache™ Hadoop® project develops open-source software for reliable, scala ...
- mysql 和php 保留2位小数
一般交易中保留的数字的小数位数为2位(即最小单位为 1分钱[0.01元]) 数据库设计中预金钱有关或要求精准度要高的用 decimal(n,m) 表示,n表示保留的数字长度,保留的小数位数,如deci ...
- 软件工程_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 ...
- 软件工程_6th weeks
一.上次博客时说的UI,拖拉到现在才展示,完成了“登录,普通匹配,做题界面,做题结果”四项 功能: 二.单元测试工具 1.python单元测试工具 最近因为论文原因一直在用Python,Pytho ...
- python模块_re模块
正则表达式笔记'''#re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none.#re.search 扫描整个字符串并返回第一个成功的匹配#fi ...