1.2课后习题
题目要求
1. 编写程序,利用栈将从键盘输入的十进制整数转换为十六进制数,并输出。
2. 一般情况下,求自然数n的阶乘n!,需要知道(n-1)!,依此类推,思考这一解题思路中是否用到栈的原理,小组讨论,说明理由。
操作序列/关键信息:
- 使用栈模拟进制转换。
- 分析递归过程与函数调用栈的关系。
参考答案与解析
一、十进制转十六进制
参考答案 - 十进制转十六进制
cpp
#include <iostream>
#include <stack>
#include <string>
std::string decimalToHexadecimal(int decimalNumber) {
std::stack<char> stk;
std::string hexDigits = "0123456789ABCDEF";
std::string result;
while (decimalNumber > 0) {
int rem = decimalNumber % 16;
stk.push(hexDigits[rem]);
decimalNumber /= 16;
}
while (!stk.empty()) {
result += stk.top();
stk.pop();
}
return result;
}
int main() {
int n;
std::cin >> n;
std::string hex = decimalToHexadecimal(n);
std::cout << hex << std::endl;
return 0;
}
二、递归与栈的原理
参考答案 - 递归与栈的原理
递归调用本质上依赖函数调用栈:每次调用时都会压入一个栈帧,保存现场;调用结束后弹出栈帧。计算n!时,每层递归对应一个栈帧,直到基例0!返回并依次出栈。
核心知识点
栈与进制转换
- LIFO:栈的后进先出特性,用于反向输出余数。
- 除基取余:不断除以16并取余实现进制转换。
递归与栈
- 函数调用栈:递归过程利用操作系统栈保存调用状态。
- 栈帧:维护局部变量和返回地址,体现栈的应用。