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] == '\0') 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 ****************************************************************/
转载于:https://www.cnblogs.com/dzzy/p/4605060.html
1216: 斐波那契数列相关推荐
- 斐波那契数列(大数)
1216: 斐波那契数列 时间限制: 1 Sec 内存限制: 128 MB 点我 题目描述 Fibonacci数列,定义如下: f(1)=f(2)=1 f(n)=f(n-1)+f(n-2) n> ...
- java 斐波拉_Java实现斐波那契数列
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...
- 剑指offer:面试题10- I. 斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 ...
- 用递归法计算斐波那契数列的第n项
斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1, ...
- 循环斐波那契数列_剑指offer #10 斐波那契数列
(递归和循环)#10 斐波那契数列 一.斐波那契数列 定义: n = 0 , f(n) = 0 n = 1 , f(n) = 1 n > 1 , f(n) = f(n-1) + f(n-2) 思 ...
- 用C语言编写:判断一个≥2的整型数是否存在于斐波那契数列中?
自己写的,感觉挺有成就感的,就展示出来吧! 判断一个≥2的整型数是否存在于斐波那契数列中? 若存在,则返回第几项:若不在,则返回-1 #include <stdio.h> long gen ...
- 算法(1)斐波那契数列
1.0 问题描述 实现斐波那契数列,求第N项的值 2.0 问题分析 斐波那契数列最简单的方法是使用递归,递归和查表法同时使用,可以降低复杂度. 根据数列特点,同时进行计算的数值其实只有3个,所以可以使 ...
- NOIP模拟题 斐波那契数列
题目大意 给定长度为$n$序列$A$,将它划分成尽可能少的若干部分,使得任意部分内两两之和均不为斐波那契数列中的某一项. 题解 不难发现$2\times 10^9$之内的斐波那契数不超过$50$个 先 ...
- 剑指offer_第7题_斐波那契数列
题目描述 现在要求输入一个整数n 输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 理解 斐波那契数列 因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子 ...
最新文章
- windows 常用thread方法
- [汇编与C语言关系]2. main函数与启动例程
- python常用内置模块-Python常用内置模块之xml模块(详解)
- python第三天(dictionary应用)转
- 【论文写作】轻松搞掂IEEE系列期刊的文章模板
- 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框
- TCP第四次挥手为什么要等待2MSL
- 过长内容分成了多次发送 问题 LengthFieldBasedFrameDecoder使用
- 测试范围不统一,引发的冲突问题
- java简单巡回置换算法程序代码_巡回置换算法(巡回置换算法实现流程)
- .NET中统一的存储过程调用方法(收藏)
- java 无法import_ImportError:无法导入名称X
- 【PHP】PHP include()和require()方法的区别
- Android打包使用自有证书认证
- 生存分析——KM生存曲线、hazard比例、PH假定检验、非比例风险模型(分层/时变/参数模型)(二)
- 30篇记录==一个月了~
- 犀牛书学习笔记(3):函数
- 功能强大且易用的云打印解决方案
- 软件工程复习 第三章 软件立项
- Dreamweaver cs6运行出现错误16的解救方法
热门文章
- 【CodeForces - 569C】Primes or Palindromes? (思维,分析范围,暴力枚举判断)
- 【HDU - 1754】I Hate It (线段树模板 单点覆盖更新+区间最大值查询)
- 【HDU - 1856】 More is better(并查集)(还需要空间优化。。)
- InfluxDB 简介、安装和简单使用
- 零基础学java web开发pdf_新手学Java Web开发.pdf
- C++primer 第 4 章 表达式 4.7条件运算符 4.8位运算符 4.9 sizeof运算符 4.10逗号运算符 4.11类型转换 4 . 1 2 运算符优先级表
- 如何用区块链保障数据安全和承载数据确权
- C/C++蓝桥杯1 备赛准备
- Android MotionEvent中getX()、getRawX()和getTop()的区别
- Linux统治超级计算领域的九个理由