leetcode算法504. 七进制数

117 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

一、题目描述:

504. 七进制数 - 力扣(LeetCode)

给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。

示例 1:

输入: num = 100
输出: "202"

示例 2:

输入: num = -7
输出: "-10"

提示:

  • -10^7 <= num <= 10^7

二、思路分析:

和经常遇到的“取一个十进制数的每一位数字”方法一样,只是这里换成了七进制,由此可推所有的进制问题。
while循环里,不断对7取余得到当前数的末尾数字,将该数字补充进字符串后,再除以7更新当前数字。
需要注意的是,取得每一位数字的顺序是从后往前,因此答案字符串需要在最后做一次翻转,翻转时需要注意是否有负号。

三、AC 代码:

char * convertToBase7(int num){
//分配的内存的字符数(11是适合该题的最小值)
#define convertToBase7_CHAR_AMOUNT (11)
//进制数(可以取2~10的任意值)
#define convertToBase7_RADIX (7)

    //分配一块足够大的内存,用于存储字符串
    char * pStr = (char *)malloc(sizeof (char) * convertToBase7_CHAR_AMOUNT);
    if (NULL == pStr)
        return NULL;
    //创建一个索引,指向这块内存之后的第一个字节
    int index = convertToBase7_CHAR_AMOUNT;

    //分三种情况进行处理(从最后一个字符开始往前填)
    if (num > 0){
        do {
            index -= 1;
            pStr[index] = (num % convertToBase7_RADIX) + '0';
            num /= convertToBase7_RADIX;
        }while (num);
    }else if(num < 0){
        do {
            index -= 1;
            pStr[index] = -(num % convertToBase7_RADIX) + '0'; //商为负,需要对其取负以转为正
            num /= convertToBase7_RADIX;
        }while (num);
        //最前边需要补一个负号
        index -= 1;
        pStr[index] = '-';
    //为0的情况
    }else {
        index -= 1;
        pStr[index] = '0';
    }

    //将所有字符推到最前
    for (int i = 0, j = index; j < convertToBase7_CHAR_AMOUNT; i += 1, j += 1)
        pStr[i] = pStr[j];
    //字符串'\0'封尾
    pStr[convertToBase7_CHAR_AMOUNT - index] = '\0';

    //返回(调用者必须对该指针调用free(),否则内存泄漏)
    return pStr;

#undef CHAR_AMOUNT
#undef RADIX
}

范文参考:

一开始想迭代出字符串,然后发现是反的,那直接递归了。原来可以直接×10,最后一次性转换 - 七进制数 - 力扣(LeetCode)

简单模拟,进制转化 - 七进制数 - 力扣(LeetCode)