2506
题目简介:
用2x1,2x2的方块填2*n的格子
方法描述:
递推、大数加法
解题思路:
1.不难看出递推公式为 F ( n ) = 2 ∗ F ( n − 2 ) + F ( n − 1 ) F(n) = 2*F(n-2)+F(n-1) F(n)=2∗F(n−2)+F(n−1)
2.用char数组存储数字进行加法。char2int,进位,int2char数组
3.我选用的方法为打表的方法,估算了以下n的范围应该再0-300之间,首先运算出300之内所有的$F(n)值,输入后直接输出对应表值即可。
完整代码:
#include "iostream"
#include "cstring"
#include "algorithm"
using namespace std;
#define Max_num 5000
char result[300][Max_num], tmp1[Max_num], tmp_2[Max_num];
void Add_char(char A[Max_num], char B[Max_num], char ans[Max_num]){ //将A,B的和放入ans中
int ans_int[Max_num]={0}; //用来存储int类型的加法结果
int num = max(strlen(A), strlen(B));
for(int i = 0; i < num;i++){
int num1 = 0;
int num2 = 0;
// 以下操作用来补齐0不同长度字符串到统一长度再进行假发
if(strlen(A)-num+i >= 0) num1 = A[strlen(A)-num+i]-'0';
if(strlen(B)-num+i >= 0) num2 = B[strlen(B)-num+i]-'0';
ans_int[i+1] = num1 + num2;
}
for(int i = num+1;i >= 0;i--){
if(ans_int[i] >= 10){ans_int[i-1]+= 1; ans_int[i]-=10;}
}
if(ans_int[0] == 1){
num++;
for(int i = 0;i < num;i++){
ans[i] = ans_int[i]+'0';
}
} //判断是否发生进位
else if(ans_int[0] == 0){
num++;
for(int i = 1;i < num;i++){
ans[i-1] = ans_int[i]+'0';
}
}
}
void tile(int input){
for(int i = 0;i <= input;i++){
if(i == 0){ strcpy(result[0], "1");}
else if(i == 1) { strcpy(result[1], "1");}
else{
Add_char(result[i-2], result[i-2], tmp1);
Add_char(result[i-1], tmp1, result[i]);
}
}
}
int main(){
tile(300); //打出300以内的表
int input;
while (cin >> input){
printf("%s\n", result[input]);
}
return 0;
}