HDU 1250Hat's Fibonacci(两种方法处理大数)
2013-08-15 09:50
176 查看
Hat's Fibonacci
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5891 Accepted Submission(s): 1944
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.
题目大意:题目的意思就不说了,主要是简单地处理大数。
解题思路:先是用C++写的处理大数,每次只涉及到两个数相加,直接转换成string,所以位数就取len较大的那位。如果第一位超过了10则直接再最前面加一个1,第一位减去10,string支持直接用"1"+。详见代码。
题目地址:Hat's Fibonacci
C++代码:
#include<iostream> #include<string> using namespace std; string add(string s1,string s2) { int j,l,la,lb; string ma,mi; ma=s1;mi=s2; if(s1.length()<s2.length()) {ma=s2;mi=s1;} la=ma.size();lb=mi.size(); l=la-1; for(j=lb-1;j>=0;j--,l--) ma[l] += mi[j]-'0'; for(j=la-1;j>=1;j--) if(ma[j]>'9') {ma[j]-=10;ma[j-1]++;} if(ma[0]>'9') //处理第一位超过9了。 {ma[0]-=10;ma='1'+ma;} return ma; } int main(){ int n,i; string a[8008]; a[1]="1"; a[2]="1"; a[3]="1"; a[4]="1"; for(i=5;i<8008;++i) a[i]=add(add(add(a[i-1],a[i-2]),a[i-3]),a[i-4]); while(cin>>n) cout<<a <<endl; return 0; }
以后遇到大数的问题,不用那么坑爹的再敲该死的那么长的模板了,直接上JAVA。
JAVA代码:
import java.util.*; import java.math.*; public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); BigInteger res[]; res = new BigInteger[8008]; res[1]=BigInteger.ONE; res[2]=BigInteger.ONE; res[3]=BigInteger.ONE; res[4]=BigInteger.ONE; for(int i=5;i<=8000;i++) { res[i]=res[i-1].add(res[i-2]); res[i]=res[i].add(res[i-3]); res[i]=res[i].add(res[i-4]); } int p; while(cin.hasNext()) { p=cin.nextInt(); System.out.println(res[p]); } } }
相关文章推荐
- HDU 2089 数位dp/字符串处理 两种方法
- Hdu 1328 IBM Minus One 字符串处理的两种方法
- Cocos2d-x处理双击事件的两种方法!
- hdu 1001 Java大数简单方法
- .NET 处理windows消息中获得LParam中XY坐标的两种方法
- VC中处理C1010错误的两种方法
- JSTL字符串处理的两种解决方法
- C++第六周任务一【任务1】下面的程序存在编译错误。有两种方法可以修改,请给出这两种修改方案,在报告中说明你倾向于用哪一种?为什么?处理此类问题的原则是什么?
- 两种方法处理recycleview的点击事件
- Java中自定义异常的两种处理方法
- MySQL数据库root账户密码忘记两种处理方法转载
- Spark Streaming中空batches处理的两种方法(转)
- hdu 1532 Drainage Ditches (网络流两种方法)
- 【Android】-- 处理 android 方法总数超过 65536 . the number of method references in a .dex file exceed 64k的两种办法
- Cocos2d-x 处理双击事件的两种方法
- 账结法”、“表结法”两种财务会计处理方法
- HDU 1198 Farm Irrigation 两种方法(dfs,并查集)
- hdu 4585 Shaolin两种方法(暴力和STL map set)
- hdu1102 prime()和kruskal()两种方法,感觉不错。 如果你要问我:我只能说,实力决定一切
- JAVA中处理大数的方法