持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
一、题目描述:
给定一个整数 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)