2 3
1 1
1 题目意思很明确:step 0:1
step 1:01C(n)=C(n-2)+2^(n-3) 其中n>=4。
其中用到了大数的处理,整体来说不难!我们先打表,之后再输出即可!话说这杭电第一页上的题目怎么有那么多水题,受不了了,下一次做一点有技巧性的题目吧!
代码如下:
#include <iostream> #include <string> using namespace std; const int SIZE = 1001; const int BASE = 10; string result[SIZE]; string two("2"); void initial() { int mcarry, temp, carry; int k; string tempResult; result[1] = "0"; result[2] = "1"; result[3] = "1"; result[4] = "3"; for (int i = 5; i < SIZE; ++i) { mcarry = 0; for (int j = 0; j < two.length(); ++j) /*先做乘法,求出2^(n-3)*/ { temp = 2 * (two[j] - '0') + mcarry; mcarry = temp / BASE; /*乘法进位*/ temp = temp % BASE; tempResult += (temp + '0'); } if (mcarry != 0) /*进位不为0*/ { tempResult += (mcarry + '0'); } two = tempResult; /*存储计算结果*/ tempResult.clear(); int minLength = two.length() > result[i - 2].length() ? result[i - 2].length() : two.length(); carry = 0; for (k = 0; k < minLength; ++k) /*然后做加法f(n) = f(n -2) + 2^(n - 3)*/ { temp = (two[k] - '0') + (result[i - 2][k] - '0') + carry; carry = temp / BASE; /*加法进位*/ temp = temp % BASE; result[i] += (temp + '0'); } /*两个数可能长短不一,所以要比较再相加*/ if (minLength < two.length()) { for(; k < two.length(); k++) { temp = (two[k] - '0') + carry; carry = temp / BASE; temp = temp % BASE; result[i] += (temp + '0'); } } if(minLength < result[i - 2].length()) { for(; k < result[i - 2].length(); ++k) { temp = (result[i - 2][k] - '0') + carry; carry = temp / BASE; temp = temp % BASE; result[i] += (temp + '0'); } } if (carry != 0) /*进位不为0*/ { result[i] += (carry + '0'); } tempResult.clear(); } } int main() { int n; initial(); /*先打表*/ while (scanf ("%d", &n) != EOF) { for(int i = result[n].length(); i > 0; --i) cout << result[n][i - 1]; /*这一步很关键,由于数据是倒着存的,所以要反着输出*/ cout << endl; } system ("pause"); return 0; }