1.数楼梯
题目:
楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式 一个数字,楼梯数。
输出格式 输出走的方式总数。
输入输出样例
4 5
代码:
//36
include
using namespace std;
int main(){
//输入楼梯数量
int n;
scanf(“%d”,&n);
//特殊情况
if(n == 1 || n == 2 ||n == 0){
cout<<n;
return 0;
}
//计算方法数量 高精度加法 存储在string 转为int[] 相加到int[]去前导零 dp1变为dp1,之和变为dp1
string dp0 = "1";
string dp1 = "2";
for(int i = 2; i < n; i++){
int a[5005] = {0},b[5005] = {0};
int temp[5005] = {0};
for(int j = 0; j < dp0.size(); j++){
a[dp0.size() - 1 - j] = dp0[j] - '0';
}
for(int j = 0; j < dp1.size(); j++){
b[dp1.size() - 1 - j] = dp1[j] - '0';
}
int max = dp0.size() > dp1.size() ? dp0.size() : dp1.size();
for(int j = 0; j < max; j++){
temp[j] += a[j] + b[j];
temp[j + 1] = temp[j] / 10 ;
temp[j] = temp[j] % 10;
}
if(temp[max] > 0){
max++;
}
dp0 = dp1;
dp1 = "";
for(int j = max - 1; j >= 0; j--){
dp1 += to_string(temp[j]);
}
}
cout<<dp1;
}
错误点:
1.字符串初始化 用”” 而不是’’
2.字符串转数字 dp1 += to_string(temp[j]);
错误写法: dp1[j] = to_string(temp[j]);错误原因:不能将string类型转为char类型
to_string赋值的对象是字符串,而dp1[j]具体成了一个char类型的字符
3.题目数值范围未搞清楚 超出long long 范围 -2^63~2^63-1后就要进行高精度加法运算 long(int) -2^31~2^31-1
1>两个加数长度位置,用字符串类型存储
2>将加数逆序转换为数值存入数组
3>进行相加,存入整型数组(仍为逆序),注意最高位是否产生进位,若是,则数组长度要加一
int a[5005] = {0},b[5005] = {0};
int temp[5005] = {0};
for(int j = 0; j < dp0.size(); j++){
a[dp0.size() - 1 - j] = dp0[j] - ‘0’;
}
for(int j = 0; j < dp1.size(); j++){
b[dp1.size() - 1 - j] = dp1[j] - ‘0’;
}
int max = dp0.size() > dp1.size() ? dp0.size() : dp1.size();
for(int j = 0; j < max; j++){
temp[j] += a[j] + b[j];
temp[j + 1] = temp[j] / 10 ;
temp[j] = temp[j] % 10;
}
if(temp[max] > 0){
max++;
}
解题思路:
相当于动态规划