zoukankan      html  css  js  c++  java
  • 大数

    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

  • 相关阅读:
    JavaScript设计模式(策略模式)
    JavaScript设计模式(单例模式)
    react中数据持久化缓存redux-persist
    webpack编写一个plugin插件
    webpack自定义loader并发布
    Vue用递归实现一个消除输入框表情符的自定义directive
    Spring MVC表单防重复提交
    @Controller,@Service,@Repository,@Component详解
    Spring Enable*高级应用及原理
    Spring Aware容器感知技术
  • 原文地址:https://www.cnblogs.com/gaolzzxin/p/4013667.html
Copyright © 2011-2022 走看看