• HDU 1250 Hat's Fibonacci(高精度)


    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.
     


    题目大意:看题。
    思路:高精度

    代码(671MS):

      1 //模板测试
      2 #include <iostream>
      3 #include <cstdio>
      4 #include <cstring>
      5 #include <string>
      6 #include <algorithm>
      7 using namespace std;
      8 
      9 const int MAXN = 2010;
     10 
     11 struct bign {
     12     int len, s[MAXN];
     13 
     14     bign () {
     15         memset(s, 0, sizeof(s));
     16         len = 1;
     17     }
     18     bign (int num) { *this = num; }
     19     bign (const char *num) { *this = num; }
     20 
     21     bign operator = (const int num) {//数字
     22         char s[MAXN];
     23         sprintf(s, "%d", num);
     24         *this = s;
     25         return *this;
     26     }
     27     bign operator = (const char *num) {//字符串
     28         for(int i = 0; num[i] == '0'; num++) ;  //去前导0
     29         if(*num == 0) --num;
     30         len = strlen(num);
     31         for(int i = 0; i < len; ++i) s[i] = num[len-i-1] - '0';
     32         return *this;
     33     }
     34 
     35     bign operator + (const bign &b) const {
     36         bign c;
     37         c.len = 0;
     38         for(int i = 0, g = 0; g || i < max(len, b.len); ++i) {
     39             int x = g;
     40             if(i < len) x += s[i];
     41             if(i < b.len) x += b.s[i];
     42             c.s[c.len++] = x % 10;
     43             g = x / 10;
     44         }
     45         return c;
     46     }
     47 
     48     bign operator += (const bign &b) {
     49         *this = *this + b;
     50         return *this;
     51     }
     52 
     53     void clean() {
     54         while(len > 1 && !s[len-1]) len--;
     55     }
     56 
     57     bign operator * (const bign &b) {
     58         bign c;
     59         c.len = len + b.len;
     60         for(int i = 0; i < len; ++i) {
     61             for(int j = 0; j < b.len; ++j) {
     62                 c.s[i+j] += s[i] * b.s[j];
     63             }
     64         }
     65         for(int i = 0; i < c.len; ++i) {
     66             c.s[i+1] += c.s[i]/10;
     67             c.s[i] %= 10;
     68         }
     69         c.clean();
     70         return c;
     71     }
     72     bign operator *= (const bign &b) {
     73         *this = *this * b;
     74         return *this;
     75     }
     76 
     77     bign operator - (const bign &b) {
     78         bign c;
     79         c.len = 0;
     80         for(int i = 0, g = 0; i < len; ++i) {
     81             int x = s[i] - g;
     82             if(i < b.len) x -= b.s[i];
     83             if(x >= 0) g = 0;
     84             else {
     85                 g = 1;
     86                 x += 10;
     87             }
     88             c.s[c.len++] = x;
     89         }
     90         c.clean();
     91         return c;
     92     }
     93     bign operator -= (const bign &b) {
     94         *this = *this - b;
     95         return *this;
     96     }
     97 
     98     bign operator / (const bign &b) {
     99         bign c, f = 0;
    100         for(int i = len - 1; i >= 0; i--) {
    101             f *= 10;
    102             f.s[0] = s[i];
    103             while(f >= b) {
    104                 f -= b;
    105                 c.s[i]++;
    106             }
    107         }
    108         c.len = len;
    109         c.clean();
    110         return c;
    111     }
    112     bign operator /= (const bign &b) {
    113         *this  = *this / b;
    114         return *this;
    115     }
    116 
    117     bign operator % (const bign &b) {
    118         bign r = *this / b;
    119         r = *this - r*b;
    120         return r;
    121     }
    122     bign operator %= (const bign &b) {
    123         *this = *this % b;
    124         return *this;
    125     }
    126 
    127     bool operator < (const bign &b) {
    128         if(len != b.len) return len < b.len;
    129         for(int i = len-1; i >= 0; i--) {
    130             if(s[i] != b.s[i]) return s[i] < b.s[i];
    131         }
    132         return false;
    133     }
    134 
    135     bool operator > (const bign &b) {
    136         if(len != b.len) return len > b.len;
    137         for(int i = len-1; i >= 0; i--) {
    138             if(s[i] != b.s[i]) return s[i] > b.s[i];
    139         }
    140         return false;
    141     }
    142 
    143     bool operator == (const bign &b) {
    144         return !(*this > b) && !(*this < b);
    145     }
    146 
    147     bool operator != (const bign &b) {
    148         return !(*this == b);
    149     }
    150 
    151     bool operator <= (const bign &b) {
    152         return *this < b || *this == b;
    153     }
    154 
    155     bool operator >= (const bign &b) {
    156         return *this > b || *this == b;
    157     }
    158 
    159     string str() const {
    160         string res = "";
    161         for(int i = 0; i < len; ++i) res = char(s[i]+'0') + res;
    162         return res;
    163     }
    164 };
    165 
    166 istream& operator >> (istream &in, bign &x) {
    167     string s;
    168     in >> s;
    169     x = s.c_str();
    170     return in;
    171 }
    172 
    173 ostream& operator << (ostream &out, const bign &x) {
    174     out << x.str();
    175     return out;
    176 }
    177 
    178 bign f[5];
    179 
    180 void solve(int n) {
    181     f[1] = f[2] = f[3] = f[4] = 1;
    182     if(n < 5) cout<<f[n]<<endl;
    183     else {
    184         int x = 1;
    185         for(int i = 5; i <= n; ++i) {
    186             f[0] = f[1] + f[2] + f[3] + f[4];
    187             f[x] = f[0];
    188             if(++x == 5) x = 1;
    189         }
    190         cout<<f[0]<<endl;
    191     }
    192 }
    193 
    194 int main() {
    195     int n;
    196     while(scanf("%d", &n)!=EOF) {
    197         solve(n);
    198     }
    199     return 0;
    200 }
    View Code
  • 相关阅读:
    apt-get install jdk
    progit-zh(Git中文文档)
    indexedDB bootstrap angularjs 前端 MVC Demo
    状态模式
    使用TypeConverter类
    wpf 全局异常捕获处理
    WPF 中的形状和基本绘图概述
    WPF设计自定义控件
    WPF快速入门系列(9)——WPF任务管理工具实现
    WPF快速入门系列(8)——MVVM快速入门
  • 原文地址:https://www.cnblogs.com/oyking/p/3270251.html
Copyright © 2020-2023  润新知