• 1216: 斐波那契数列


    From:  合工宣OJ      http://xcacm.hfut.edu.cn/problem.php?id=1216

    时间限制: 1 Sec  内存限制: 128 MB

    题目描述 Fibonacci数列,定义如下: f(1)=f(2)=1 f(n)=f(n-1)+f(n-2) n>=3 计算第n项Fibonacci数值。

    输入

    输入第一行为一个整数n(1<=n<=10000)。

    输出

    输出对应的f(n)。

    样例输入

    1 2 3 4 5

    样例输出

    1 1 2 3 5

    本题需要用到大整数,unsign long long已经明显装不下了,c++没有内置封装好的大整数(而JAVA是有的),需要自己定义大整数,大整数的模板很好找到,然而很多功能需要根据实际需要删减,本题只需重载加减符号,然而为用的方便此处未作删减。菲波那切递推公式已经给出,只需循环将每一个情况存在大整数开出的数组里,用时调用即可。原先把#define MAX_L 3000 开到了10000 结果出现内存超限,改合适一些内存会降低很多。 代码如下:

      1 #include<string>
      2 #include<iostream>
      3 #include<iosfwd>
      4 #include<cmath>
      5 #include<cstring>
      6 #include<stdlib.h>
      7 #include<stdio.h>
      8 #include<cstring>
      9 #define MAX_L 3000 
     10 using namespace std;
     11 class bign                           //定义大整数
     12 {
     13 public:
     14         int len, s[MAX_L];
     15         bign();
     16         bign(const char*);
     17         bign(int);
     18         bool sign;
     19         string toStr() const;
     20         friend istream& operator>>(istream &,bign &);
     21         friend ostream& operator<<(ostream &,bign &);
     22         bign operator=(const char*);
     23         bign operator=(int);
     24         bign operator=(const string);
     25         bool operator>(const bign &) const;
     26         bool operator>=(const bign &) const;
     27         bool operator<(const bign &) const;
     28         bool operator<=(const bign &) const;
     29         bool operator==(const bign &) const;
     30         bool operator!=(const bign &) const;
     31         bign operator+(const bign &) const;
     32         bign operator++();
     33         bign operator++(int);
     34         bign operator+=(const bign&);
     35         bign operator-(const bign &) const;
     36         bign operator--();
     37         bign operator--(int);
     38         bign operator-=(const bign&);
     39         bign operator*(const bign &)const;
     40         bign operator*(const int num)const;
     41         bign operator*=(const bign&);
     42         bign operator/(const bign&)const;
     43         bign operator/=(const bign&);
     44         bign operator%(const bign&)const;
     45         void clean();
     46         ~bign();
     47 };
     48 #define max(a,b) a>b ? a : b
     49 #define min(a,b) a<b ? a : b
     50 bign::bign()
     51 {
     52     memset(s, 0, sizeof(s));
     53     len = 1;
     54     sign = 1;
     55 }
     56 bign::bign(const char *num)
     57 {
     58     *this = num;
     59 }
     60 bign::bign(int num)
     61 {
     62     *this = num;
     63 }
     64 string bign::toStr() const
     65 {
     66     string res;
     67     res = "";
     68     for (int i = 0; i < len; i++)
     69         res = (char)(s[i] + '0') + res;
     70     if (res == "")
     71         res = "0";
     72     if (!sign&&res != "0")
     73         res = "-" + res;
     74     return res;
     75 }
     76 istream &operator>>(istream &in, bign &num)
     77 {
     78     string str;
     79     in>>str;
     80     num=str;
     81     return in;
     82 }
     83 ostream &operator<<(ostream &out, bign &num)
     84 {
     85     out<<num.toStr();
     86     return out;
     87 }
     88 bign bign::operator=(const char *num)
     89 {
     90     memset(s, 0, sizeof(s));
     91     char a[MAX_L] = "";
     92     if (num[0] != '-')
     93         strcpy(a, num);
     94     else
     95         for (int i = 1; i < strlen(num); i++)
     96             a[i - 1] = num[i];
     97     sign = !(num[0] == '-');
     98     len = strlen(a);
     99     for (int i = 0; i < strlen(a); i++)
    100         s[i] = a[len - i - 1] - 48;
    101     return *this;
    102 }
    103 bign bign::operator=(int num)
    104 {
    105     if (num < 0)
    106         sign = 0, num = -num;
    107     else
    108         sign = 1;
    109     char temp[MAX_L];
    110     sprintf(temp, "%d", num);
    111     *this = temp;
    112     return *this;
    113 }
    114 bign bign::operator=(const string num)
    115 {
    116     const char *tmp;
    117     tmp = num.c_str();
    118     *this = tmp;
    119     return *this;
    120 }
    121 bool bign::operator<(const bign &num) const
    122 {
    123     if (sign^num.sign)
    124         return num.sign;
    125     if (len != num.len)
    126         return len < num.len;
    127     for (int i = len - 1; i >= 0; i--)
    128         if (s[i] != num.s[i])
    129             return sign ? (s[i] < num.s[i]) : (!(s[i] < num.s[i]));
    130     return !sign;
    131 }
    132 bool bign::operator>(const bign&num)const
    133 {
    134     return num < *this;
    135 }
    136 bool bign::operator<=(const bign&num)const
    137 {
    138     return !(*this>num);
    139 }
    140 bool bign::operator>=(const bign&num)const
    141 {
    142     return !(*this<num);
    143 }
    144 bool bign::operator!=(const bign&num)const
    145 {
    146     return *this > num || *this < num;
    147 }
    148 bool bign::operator==(const bign&num)const
    149 {
    150     return !(num != *this);
    151 }
    152 bign bign::operator+(const bign &num) const
    153 {
    154     if (sign^num.sign)
    155     {
    156         bign tmp = sign ? num : *this;
    157         tmp.sign = 1;
    158         return sign ? *this - tmp : num - tmp;
    159     }
    160     bign result;
    161     result.len = 0;
    162     int temp = 0;
    163     for (int i = 0; temp || i < (max(len, num.len)); i++)
    164     {
    165         int t = s[i] + num.s[i] + temp;
    166         result.s[result.len++] = t % 10;
    167         temp = t / 10;
    168     }
    169     result.sign = sign;
    170     return result;
    171 }
    172 bign bign::operator++()
    173 {
    174     *this = *this + 1;
    175     return *this;
    176 }
    177 bign bign::operator++(int)
    178 {
    179     bign old = *this;
    180     ++(*this);
    181     return old;
    182 }
    183 bign bign::operator+=(const bign &num)
    184 {
    185     *this = *this + num;
    186     return *this;
    187 }
    188 bign bign::operator-(const bign &num) const
    189 {
    190     bign b=num,a=*this;
    191     if (!num.sign && !sign)
    192     {
    193         b.sign=1;
    194         a.sign=1;
    195         return b-a;
    196     }
    197     if (!b.sign)
    198     {
    199         b.sign=1;
    200         return a+b;
    201     }
    202     if (!a.sign)
    203     {
    204         a.sign=1;
    205         b=bign(0)-(a+b);
    206         return b;
    207     }
    208     if (a<b)
    209     {
    210         bign c=(b-a);
    211         c.sign=false;
    212         return c;
    213     }
    214     bign result;
    215     result.len = 0;
    216     for (int i = 0, g = 0; i < a.len; i++)
    217     {
    218         int x = a.s[i] - g;
    219         if (i < b.len) x -= b.s[i];
    220         if (x >= 0) g = 0;
    221         else
    222         {
    223             g = 1;
    224             x += 10;
    225         }
    226         result.s[result.len++] = x;
    227     }
    228     result.clean();
    229     return result;
    230 }
    231 bign bign::operator * (const bign &num)const
    232 {
    233     bign result;
    234     result.len = len + num.len;
    235 
    236     for (int i = 0; i < len; i++)
    237         for (int j = 0; j < num.len; j++)
    238             result.s[i + j] += s[i] * num.s[j];
    239 
    240     for (int i = 0; i < result.len; i++)
    241     {
    242         result.s[i + 1] += result.s[i] / 10;
    243         result.s[i] %= 10;
    244     }
    245     result.clean();
    246     result.sign = !(sign^num.sign);
    247     return result;
    248 }
    249 bign bign::operator*(const int num)const
    250 {
    251     bign x = num;
    252     bign z = *this;
    253     return x*z;
    254 }
    255 bign bign::operator*=(const bign&num)
    256 {
    257     *this = *this * num;
    258     return *this;
    259 }
    260 bign bign::operator /(const bign&num)const
    261 {
    262     bign ans;
    263     ans.len = len - num.len + 1;
    264     if (ans.len < 0)
    265     {
    266         ans.len = 1;
    267         return ans;
    268     }
    269 
    270     bign divisor = *this, divid = num;
    271     divisor.sign = divid.sign = 1;
    272     int k = ans.len - 1;
    273     int j = len - 1;
    274     while (k >= 0)
    275     {
    276         while (divisor.s[j] == 0) j--;
    277         if (k > j) k = j;
    278         char z[MAX_L];
    279         memset(z, 0, sizeof(z));
    280         for (int i = j; i >= k; i--)
    281             z[j - i] = divisor.s[i] + '0';
    282         bign dividend = z;
    283         if (dividend < divid) { k--; continue; }
    284         int key = 0;
    285         while (divid*key <= dividend) key++;
    286         key--;
    287         ans.s[k] = key;
    288         bign temp = divid*key;
    289         for (int i = 0; i < k; i++)
    290             temp = temp * 10;
    291         divisor = divisor - temp;
    292         k--;
    293     }
    294     ans.clean();
    295     ans.sign = !(sign^num.sign);
    296     return ans;
    297 }
    298 bign bign::operator/=(const bign&num)
    299 {
    300     *this = *this / num;
    301     return *this;
    302 }
    303 bign bign::operator%(const bign& num)const
    304 {
    305     bign a = *this, b = num;
    306     a.sign = b.sign = 1;
    307     bign result, temp = a / b*b;
    308     result = a - temp;
    309     result.sign = sign;
    310     return result;
    311 }
    312 void bign::clean()
    313 {
    314     if (len == 0) len++;
    315     while (len > 1 && s[len - 1] == '')
    316         len--;
    317 }
    318 bign::~bign() {}
    319 
    320 bign f[10002];             //大整数数组
    321 
    322 int main()
    323 {
    324     int a,i;
    325     f[4]=3;f[1]=1;f[2]=1;f[3]=2;
    326     for(i=5;i<=10000;i++)
    327     {
    328         f[i]=f[i-1]+f[i-2];
    329     }
    330    while(cin>>a)
    331    {
    332         cout<<f[a]<<endl;
    333    }
    334    return 0;
    335 }
    336 /**************************************************************
    337     Problem: 1216
    338     User: 2014217052
    339     Language: C++
    340     Result: 正确
    341     Time:864 ms
    342     Memory:118808 kb
    343 ****************************************************************/
  • 相关阅读:
    Fiddler 教程
    ios iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)
    ios 生成一个动态的随机的头像/随机数的操作
    在工程中如何使用一个公用的页面
    使用手势,让键盘在点击空白处消失
    ios开发之--iOS 11适配:iOS11导航栏返回偏移
    svn 操作字母的提示
    字面量
    控制 打开和关闭远程推送通知
    常见结构体 日期 字符串的操作 很实用
  • 原文地址:https://www.cnblogs.com/dzzy/p/4605060.html
Copyright © 2020-2023  润新知