大数

Hat's Fibonacci http://acm.hdu.edu.cn/showproblem.php?pid=1250

java

 1 import java.math.BigInteger;
 2 import java.util.Scanner;
 3 
 4 public class Main {
 5     public static void main(String args[]){
 6         Scanner cin=new Scanner(System.in);
 7         BigInteger dp[]=new BigInteger[10010];
 8         dp[1]=dp[2]=dp[3]=dp[4]=BigInteger.ONE;
 9         for(int i=5;i<=10000;i++){
10             dp[i]=dp[i-1];
11             for(int j=2;j<=4;j++){
12                 dp[i]=dp[i].add(dp[i-j]);
13             }
14         }
15         while(cin.hasNext()){
16             int n=cin.nextInt();
17             System.out.println(dp[n]);
18         }
19     }
20 }
View Code

 高精度,存不了,只能递推算

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #define mt(a,b) memset(a,b,sizeof(a))
  5 using namespace std;
  6 const int M=2020;
  7 class Hp { //高精度类
  8     int len,s[M];
  9 public:
 10     void init() {
 11         len=1;
 12         mt(s,0);
 13     }
 14     void init(char ch[]) {
 15         len=1;
 16         mt(s,0);
 17         int i=0;
 18         while(ch[i]=='0'&&ch[i]!=0) i++;
 19         if(ch[i]!=0) {
 20             len=strlen(ch)-i;
 21             for(i=0; i<len; i++) {
 22                 s[i]=ch[len-i-1]-48;
 23             }
 24         }
 25     }
 26     void init(int x) {
 27         len=1;
 28         mt(s,0);
 29         while(x) {
 30             s[len-1]=x%10;
 31             x/=10;
 32             if(x) len++;
 33         }
 34     }
 35     void init(const Hp& a) {
 36         len=a.len;
 37         for(int i=0; i<M; i++) {
 38             s[i]=a.s[i];
 39         }
 40     }
 41     void print() { //输出
 42         int i=len-1;
 43         while(s[i]==0&&i>0) i--;
 44         for(; i>=0; i--) {
 45             printf("%d",s[i]);
 46         }
 47     }
 48     int cmp(Hp a) { //比较,类似于char数组比较
 49         if(len<a.len) return -1;
 50         else if(len>a.len) return 1;
 51         else {
 52             int temp=len-1;
 53             while(temp>=0&&s[temp]==a.s[temp]) temp--;
 54             if(temp==-1) return 0;
 55             else if(s[temp]<a.s[temp]) return -1;
 56             else return 1;
 57         }
 58     }
 59     void add(Hp a) { //高精度与高精度相加
 60         int templen=max(len,a.len);
 61         for(int i=0; i<templen; i++) {
 62             s[i]+=a.s[i];
 63             if(s[i]>9) {
 64                 s[i]-=10;
 65                 s[i+1]++;
 66             }
 67         }
 68         len=templen;
 69         if(s[len]!=0) len++;
 70     }
 71     void add(int x) { //高精度加单精度
 72         int temp=0;
 73         s[0]+=x;
 74         while(s[temp]>9) {
 75             s[temp]-=10;
 76             temp++;
 77             s[temp]++;
 78         }
 79         if(s[len]!=0) len++;
 80     }
 81     void subtract(Hp a) { //高精度减高精度
 82         for(int i=0; i<len; i++) {
 83             s[i]-=a.s[i];
 84             if(s[i]<0) {
 85                 s[i]+=10;
 86                 s[i+1]--;
 87             }
 88         }
 89         while(len>1&&s[len-1]==0) len--;
 90     }
 91     void multiply10() { //高精度乘10
 92         for(int i=len-1; i>=0; i--) {
 93             s[i+1]=s[i];
 94         }
 95         len++;
 96         if(s[len-1]==0) len--;
 97     }
 98     void multiply(int b) { //高精度乘单精度
 99         int temp=0;
100         for(int i=0; i<len; i++) {
101             temp+=s[i]*b;
102             s[i]=temp%10;
103             temp/=10;
104         }
105         s[len++]=temp;
106         while(s[len-1]>10) {
107             s[len]+=s[len-1]/10;
108             s[len-1]%=10;
109             len++;
110         }
111         while(len>1&&s[len-1]==0) len--;
112     }
113     void multiply(Hp b) { //高精度乘高精度
114         Hp c;
115         mt(c.s,0);
116         for(int i=0; i<len; i++) {
117             for(int j=0; j<b.len; j++) {
118                 c.s[i+j]+=s[i]*b.s[j];
119                 c.s[i+j+1]+=c.s[i+j]/10;
120                 c.s[i+j]%=10;
121             }
122         }
123         len=len+b.len;
124         for(int i=0; i<len; i++) {
125             s[i]=c.s[i];
126         }
127         while(len>1&&s[len-1]==0) len--;
128     }
129     int divide(int b) { //高精度除单精度
130         int ret=0;
131         for(int i=len-1; i>0; i--) {
132             s[i-1]+=(s[i]%b)*10;
133             s[i]/=b;
134         }
135         ret=s[0]%b;
136         s[0]/=b;
137         while(len>1&&s[len-1]==0) len--;
138         return ret;
139     }
140     Hp divide(Hp b) { //高精度除高精度
141         Hp c,d;
142         mt(c.s,0);
143         mt(d.s,0);
144         d.len=1;
145         for(int i=len-1; i>=0; i--) {
146             d.multiply10();
147             d.s[0]=s[i];
148             while(d.cmp(b)>=0) {
149                 d.subtract(b);
150                 c.s[i]++;
151             }
152         }
153         for(int i=0; i<len; i++) {
154             s[i]=c.s[i];
155         }
156         while(len>1&&s[len-1]==0) len--;
157         while(d.len>1&&d.s[d.len-1]==0) d.len--;
158         return d;
159     }
160 } dp[8];
161 int main() {
162     int n;
163     while(~scanf("%d",&n)){
164         if(n<5){
165             puts("1");
166             continue;
167         }
168         dp[1].init(1);
169         dp[2].init(1);
170         dp[3].init(1);
171         dp[4].init(1);
172         for(int i=5;i<=n;i++){
173             dp[5].init(dp[4]);
174             for(int j=1;j<=3;j++){
175                 dp[5].add(dp[j]);
176             }
177             for(int j=1;j<=4;j++){
178                 dp[j].init(dp[j+1]);
179             }
180         }
181         dp[5].print();
182         puts("");
183     }
184     return 0;
185 }
View Code

 

 

 

 

end

 

posted on 2014-10-09 16:26  gaolzzxin  阅读(165)  评论(0编辑  收藏  举报