/******************************************************************************** * 版权所有(c) YYYY, <JJYY>, 保留所有权利 *******************************************************************************/ #include "stdafx.h" #include <iostream.h> #include <string.h> #define MAXLEN 2000 #define MAX(a, b) (((a)>(b))?(a):(b)) #define OUT char* add(char* pStr1, char* pStr2); char* FacBigFun(int n, OUT char* Total); int main(int argc, char* argv[]) { char Total[MAXLEN] = {0}; cout << FacBigFun(2009, Total) << endl; return 0; cout << add("823", "823") << endl; return 0; } /*! @function ******************************************************************************** 函数名 : FacFun 功能 : 用循环求斐波那契数列第N项 参数 : n项 返回值 : 第n项的结果用int表示 抛出异常 : 无 *******************************************************************************/ /* int FacFun(int n) { //特殊情况 if ((n == 1) || (n == 2)) { return 1; } int nOne = 1; int nTwo = 1; int nTotal = 0; for (int i = 3; i <= n; i++) { nTotal = nOne + nTwo; nOne = nTwo; nTwo = nTotal; } return nTotal; } */ /*! @function ******************************************************************************** 函数名 : FacFun 功能 : 重载大数之和求循环求斐波那契数列第N项(n比较大的时) 参数 : n项 返回值 : 第n项的结果用char*表示 抛出异常 : 无 *******************************************************************************/ char* FacBigFun(int n , OUT char* Total) { //特殊情况 if ((n == 1) || (n == 2)) { return "1"; } char One[MAXLEN] = "1"; char Two[MAXLEN] = "1"; memset(Total, 0, MAXLEN); for (int i = 3; i <= n; i++) { memcpy(Total, add(One, Two), MAXLEN); //nTotal = nOne + nTwo; memcpy(One, Two, MAXLEN); //nOne = nTwo; memcpy(Two, Total, MAXLEN); //nTwo = nTotal; cout << i << " " << Total << endl; } return Total; } /*! @function ******************************************************************************** 函数名 : add 功能 : 求两个大数之和 参数 : 两个用字符串表示的大数 返回值 : 大数之和 抛出异常 : 无 *******************************************************************************/ char* add(char* pStr1, char* pStr2) { int nLen1 = strlen(pStr1); int nLen2 = strlen(pStr2); int maxLen = MAX(nLen1, nLen2); int nStr1 = 0; int nStr2 = 0; int nFlag = 0; char Total[MAXLEN] = {0}; for (int i = 0; i < maxLen; i ++) { if (nLen1-i>=1) { nStr1 = pStr1[nLen1-i-1] - '0'; } else { nStr1 = 0; } if (nLen2-i>=1) { nStr2 = pStr2[nLen2-i-1] - '0'; } else { nStr2 = 0; } Total[i] = (nStr1 + nStr2 + nFlag)%10 + '0'; nFlag = (nFlag + nStr1 + nStr2)/10; } if (nFlag == 1) { Total[i] = '1'; } int nLen = strlen(Total); char Result[MAXLEN] = {0}; for (int j = 0; j < nLen; j++) { Result[j] = Total[nLen-j-1]; } return Result; }