Skip to content

1.2课后习题

题目要求

1. 编写程序,利用栈将从键盘输入的十进制整数转换为十六进制数,并输出。

2. 一般情况下,求自然数n的阶乘n!,需要知道(n-1)!,依此类推,思考这一解题思路中是否用到栈的原理,小组讨论,说明理由。

操作序列/关键信息

  1. 使用栈模拟进制转换。
  2. 分析递归过程与函数调用栈的关系。

参考答案与解析

一、十进制转十六进制

参考答案 - 十进制转十六进制
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!返回并依次出栈。

核心知识点

栈与进制转换

  1. LIFO:栈的后进先出特性,用于反向输出余数。
  2. 除基取余:不断除以16并取余实现进制转换。

递归与栈

  1. 函数调用栈:递归过程利用操作系统栈保存调用状态。
  2. 栈帧:维护局部变量和返回地址,体现栈的应用。