牛客网刷题 | BC95 小乐乐与进制转换

目前主要分为三个专栏,后续还会添加:

        专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


 描述

小乐乐在课上学习了二进制八进制与十六进制后,对进制转换产生了浓厚的兴趣。因为他的幸运数字是6,所以他想知道一个数表示为六进制后的结果。请你帮助他解决这个问题。

输入描述:

输入一个正整数n  (1 ≤ n ≤ 109)

输出描述:

输出一行,为正整数n表示为六进制的结果


解题思路 : 

确定基数:十进制转六进制,基数为6。

除以基数:将十进制数除以6。

记录余数:将得到的余数作为六进制数的最低位(最右边的位)。

继续除以基数:将得到的商继续除以6。

重复过程:重复除法和记录余数的步骤,直到商为0。

得到六进制数:将所有记录的余数从下到上(即从最后得到的余数到第一个得到的余数)排列,得到的序列就是原始十进制数的六进制表示。


输入处理

首先,需要从用户那里获取输入的十进制数。在C语言中,这通常通过scanf函数实现。

理解进制转换原理

理解进制转换的基本原理:将一个数除以新的基数,记录下余数,然后用商继续除以基数,重复这个过程,直到商为0。

初始化变量

定义一个变量来存储中间的商,以及一个字符数组或字符串来存储转换后的六进制数。

执行转换

使用循环(例如while循环)来重复执行除法和取余操作: a. 将输入的十进制数与6进行取模操作,得到余数。 b. 将这个余数转换为对应的字符('0'-'5'),并追加到结果字符串的前面。 c. 将输入的十进制数除以6,得到新的商,继续下一次循环。

处理特殊情况

如果输入的十进制数小于6,直接将对应的字符输出即可。

逆序输出

由于在转换过程中,我们是从最低位(个位)开始构建六进制数的,所以得到的字符串是反向的。需要将其逆序输出。


代码 1 :

#include <stdio.h>
#include <stdlib.h> // 引入stdlib库,用于atoi函数

int main() {
    int decimal; // 十进制数
    char base6[33]; // 假设最多32位的十进制数转换为六进制最多需要33个字符(包括结尾的'\0')
    int index = 0; // 用于记录base6数组中当前字符的位置

    // 读取用户输入的十进制数
    printf("Enter a decimal number: ");
    scanf("%d", &decimal);

    // 特殊情况处理:如果输入的十进制数是0,直接输出'0'
    if (decimal == 0) {
        printf("0\n");
        return 0;
    }

    // 执行十进制到六进制的转换
    while (decimal > 0) {
        int remainder = decimal % 6; // 计算余数
        base6[index++] = '0' + remainder; // 将余数转换为字符并存储
        decimal /= 6; // 更新十进制数
    }

    // 由于我们是逆序存储的,所以需要逆序输出结果
    base6[index] = '\0'; // 在字符串末尾添加结束符
    for (int i = index - 1; i >= 0; i--) {
        printf("%c", base6[i]);
    }
    printf("\n");

    return 0;
}

代码 2 :

#include <stdio.h> // 引入标准输入输出库,用于进行输入输出操作

void six(int n) // 定义一个名为six的函数,它接受一个整型参数n
{
    if(n != 0) // 当n不等于0时,进入函数体
    {
        if(n >= 5) // 当n大于或等于5时,需要先进行递归处理高位
            six(n / 6); // 递归调用six函数,传入n除以6的商
        printf("%d", n % 6); // 打印n对6的余数,这是六进制的当前最低位
    }
    // 注意:这里的if结构有些冗余,因为每次循环都会执行printf,可以简化
}

int main() // 定义主函数
{
    int a = 0; // 定义一个整型变量a,用于存储用户输入的十进制数
    scanf("%d", &a); // 使用scanf函数从标准输入读取一个整数到变量a
    six(a); // 调用six函数,传入用户输入的十进制数a
    return 0; // main函数返回0,表示程序正常结束
}

这段代码中,six函数是一个递归函数,用于将十进制数n转换为六进制数。

它首先检查n是否不为0,如果不为0,则检查n是否大于或等于5(这实际上是不必要的,因为即使n小于5,递归调用也是正确的)。然后,它递归地调用自身,传入n除以6的结果作为新的参数。

在每次递归调用结束后,它打印出n除以6的余数,这是六进制表示中的当前最低位数字。这个过程一直重复,直到n为0。

需要注意的是,这段代码并没有处理输入为0的情况,如果用户输入0,程序将不会打印任何内容。而在题目要求中,输入0应该输出0

此外,代码中的if(n >= 5)条件是多余的,因为无论n的值是多少,递归逻辑都是正确的。

代码 3 :

#include <stdio.h> // 引入标准输入输出库,用于进行输入输出操作

int main() // 定义主函数
{
    int n = 0; // 定义一个整型变量n,用于存储用户输入的十进制数,并初始化为0
    int arr[1000] = { 0 }; // 定义一个整型数组arr,大小为1000,用于存储转换过程中的每一位,初始化所有元素为0

    scanf("%d", &n); // 使用scanf函数从标准输入读取一个整数到变量n

    int i = 0; // 定义一个整型变量i,用作数组索引,初始化为0

    // 使用while循环进行十进制到六进制的转换
    while (n) // 当n不为0时,继续循环
    {
        arr[i++] = n % 6; // 计算n除以6的余数,将其存储在arr[i]中,然后i加1
        n /= 6; // 将n除以6,更新n的值
    }

    // 使用for循环逆序输出六进制的每一位
    for (i--; i >= 0; i--) // 将i减1,因为之前在while循环中i已经超出了数组的索引范围,然后从i >= 0开始递减i
    {
        printf("%d", arr[i]); // 输出数组arr中索引为i的元素,即六进制数的当前位
    }

    return 0; // main函数返回0,表示程序正常结束
}

这段代码首先读取用户输入的十进制数n,然后通过while循环不断地将n除以6并记录余数,直到n为0。

余数被存储在数组arr中,由于每次都是先计算余数再更新n的值,所以余数实际上是逆序存储的。

为了正确输出六进制数,需要使用for循环从数组arr的末尾开始逆序输出每一位数字。 


 扩展 : 十进制转换位六进制

  1. 确定基数:十进制转六进制,基数为6。

  2. 除以基数:将十进制数除以6。

  3. 记录余数:将得到的余数作为六进制数的最低位(最右边的位)。

  4. 继续除以基数:将得到的商继续除以6。

  5. 重复过程:重复除法和记录余数的步骤,直到商为0。

  6. 得到六进制数:将所有记录的余数从下到上(即从最后得到的余数到第一个得到的余数)排列,得到的序列就是原始十进制数的六进制表示。

示例:将十进制数 25 转换为六进制数

  1. 25÷6=425÷6=4 余数 11,记录余数1。
  2. 商 44 再次除以6,4÷6=04÷6=0 余数 44,记录余数4。
  3. 商变为0,停止除法过程。

因此,十进制数25的六进制表示是41(从下到上读取余数)。

实际应用:

在编程中,许多编程语言提供了内置函数来处理进制转换。例如,在Python中,你可以使用内置的hex()函数来将十进制数转换为十六进制数,然后根据需要手动转换为六进制。对于其他编程语言,可能需要自己编写函数来执行这个转换。

例子1:十进制 25 转换为六进制

除以基数:将 25 除以 6,得到商 4 和余数 1。

记录余数:余数 1 是六进制数的个位。

继续除以基数:将商 4 除以 6,得到商 0 和余数 4。

停止条件:商为 0,停止除法过程。

排列余数:从最后得到的余数到第一个,即 4 和 1。

结果:十进制 25 转换为六进制是 41。

例子2:十进制 123 转换为六进制

除以基数:123 除以 6,商 20 余数 3。

记录余数:余数 3 记下。

继续除以基数:20 除以 6,商 3 余数 2。

继续除以基数:3 除以 6,商 0 余数 3。

停止条件:商为 0。

排列余数:从最后到第一个,即 3、2、3。

结果:十进制 123 转换为六进制是 323。

例子3:十进制 999 转换为六进制

除以基数:999 除以 6,商 166 余数 3。

记录余数:余数 3 记下。

继续除以基数:166 除以 6,商 27 余数 4。

继续除以基数:27 除以 6,商 4 余数 3。

继续除以基数:4 除以 6,商 0 余数 4。

停止条件:商为 0。

排列余数:从最后到第一个,即 4、3、4、3。

结果:十进制 999 转换为六进制是 4343。

例子4:十进制 2461 转换为六进制

除以基数:2461 除以 6,商 410 余数 1。

记录余数:余数 1 记下。

继续除以基数:410 除以 6,商 68 余数 2。

继续除以基数:68 除以 6,商 11 余数 4。

继续除以基数:11 除以 6,商 1 余数 5。

继续除以基数:1 除以 6,商 0 余数 1。

停止条件:商为 0。

排列余数:从最后到第一个,即 1、5、4、2、1。

结果:十进制 2461 转换为六进制是 15421。

通过这些例子,你可以看到十进制转六进制的基本步骤是一致的:不断地除以6并记录余数,直到商为0,然后将余数逆序排列得到六进制数。

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值