这道题比较简单,主要时注意细节,比如整数有正负之分,在输出的时候注意要输出正负。
calss solution{
public:
string converToBase7(int num){
if(num == 0){
return "0";
}
bool negative = num < 0;
num = abs(num);
string digits;
while(num > 0){
digits.push_back(num % 7 + '0');
num /= 7;
}
if(negative){
digits.push_back('_');
}
reverse(digits.begin(),digits.end());
return digits.;
}
后面来个难一点的。
在补码运算中,最高为表示符号位,符号位是0表示正整数和零,符号位是1表示负整数。32位有符号整数的二进制有32位,由于一位16进制数对应四位二进制数,因此32位有符号整数的十六进制数有8位,将num的二进制数按四位为一组分成8组,依次将每一组转换为对应的十六进制数,即可得到num的十六进制数。
假设二进制数的8组从低位到高位依次是第0组到第7组,则对于第i组,可以通过(nums>>(4*i))&0xf得到该组的值,其取值范围是0到15(即十六进制的f)。将每一组的值转换为十六进制数的作为如下:
对于0到9,数字本身就是十六进制;
对于10到15,将其转换为a到f中的对应字母。
对于负整数,由于最高位一定不是0,因此不会出现前导为0。对于零和正整数,可能出现前导零。避免前导零的做法如下:
如果num=0,则直接返回0
如果num>0,则在遍历每一组的值时,从第一个不是0的值开始拼接成十六进制数。
calss solution{
public:
string converToBase16(int num){
if(num == 0){
return "0";
}
string sb;
for(int i = 7; i >= 0; i--){
int val = (num >> ( 4 * i ) & 0xf);
if(sb.length() > 0 || val > 0){
char digit = val < 10 ? (char)('0' + val);
sb.push_back(digit);
}
}
return sb;
}
总结:
第一题考察取余和取整,第二题考察的是位运算。